Advertisement
Guest User

Untitled

a guest
Feb 9th, 2016
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Immutable
  8. {
  9. public struct PartyName
  10. {
  11. public string Name { get; }
  12.  
  13. public PartyName(string name)
  14. {
  15. Name = name;
  16. }
  17. }
  18.  
  19. public struct PartyCode
  20. {
  21. public string Code { get; }
  22.  
  23. public PartyCode(string code)
  24. {
  25. Code = code;
  26. }
  27. }
  28.  
  29. public abstract class Party<T>
  30. where T : Party<T>
  31. {
  32. public PartyName Name { get; }
  33.  
  34. public PartyCode Code { get; }
  35.  
  36. public abstract T WithName(PartyName name);
  37.  
  38. public abstract T WithCode(PartyCode code);
  39.  
  40. protected Party(PartyName name, PartyCode code)
  41. {
  42. Name = name;
  43. Code = code;
  44. }
  45.  
  46. protected Party(Party<T> original)
  47. {
  48. Name = original.Name;
  49. Code = original.Code;
  50. }
  51.  
  52. protected Party(Party<T> original, PartyName name)
  53. {
  54. Name = name;
  55. Code = original.Code;
  56. }
  57.  
  58. protected Party(Party<T> original, PartyCode code)
  59. {
  60. Name = original.Name;
  61. Code = code;
  62. }
  63. }
  64.  
  65. public struct PersonAge
  66. {
  67. public int Age { get; }
  68.  
  69. public PersonAge(int age)
  70. {
  71. Age = age;
  72. }
  73. }
  74.  
  75. public class Person : Party<Person>
  76. {
  77. public PersonAge Age { get; }
  78.  
  79. public Person(PartyName name, PartyCode code, PersonAge age)
  80. : base(name, code)
  81. {
  82. Age = age;
  83. }
  84.  
  85. public Person WithAge(PersonAge age)
  86. {
  87. return new Person(this, age);
  88. }
  89.  
  90. public override Person WithName(PartyName name)
  91. {
  92. return new Person(this, name);
  93. }
  94.  
  95. public override Person WithCode(PartyCode code)
  96. {
  97. return new Person(this, code);
  98. }
  99.  
  100. protected Person(Person original, PartyName name)
  101. : base(original, name)
  102. {
  103. Age = original.Age;
  104. }
  105.  
  106. protected Person(Person original, PartyCode code)
  107. : base(original, code)
  108. {
  109. Age = original.Age;
  110. }
  111.  
  112. protected Person(Person original, PersonAge age)
  113. : base(original)
  114. {
  115. Age = age;
  116. }
  117. }
  118.  
  119. public struct CompanyNumber
  120. {
  121. public int Number { get; }
  122.  
  123. public CompanyNumber(int number)
  124. {
  125. Number = number;
  126. }
  127. }
  128.  
  129. public class Company : Party<Company>
  130. {
  131. public CompanyNumber CompanyNumber { get; }
  132.  
  133. public Company(PartyName name, PartyCode code, CompanyNumber number)
  134. : base(name, code)
  135. {
  136. CompanyNumber = number;
  137. }
  138.  
  139. public Company WithAge(CompanyNumber number)
  140. {
  141. return new Company(this, number);
  142. }
  143.  
  144. public override Company WithName(PartyName name)
  145. {
  146. return new Company(this, name);
  147. }
  148.  
  149. public override Company WithCode(PartyCode code)
  150. {
  151. return new Company(this, code);
  152. }
  153.  
  154. protected Company(Company original, PartyName name)
  155. : base(original, name)
  156. {
  157. CompanyNumber = original.CompanyNumber;
  158. }
  159.  
  160. protected Company(Company original, PartyCode code)
  161. : base(original, code)
  162. {
  163. CompanyNumber = original.CompanyNumber;
  164. }
  165.  
  166. protected Company(Company original, CompanyNumber number)
  167. : base(original)
  168. {
  169. CompanyNumber = number;
  170. }
  171. }
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement