假设我有以下两个类:
public class Person
{
public string Name { get; set; }
public string Address { get; set; }
}
public class Customer: Person
{
public string CustomerNumber { get; set; }
public string PaymentTerms { get; set; }
}
现在,如果我想成为某个人的客户,据我所知,我有三个选择,我希望就哪个最好以及任何其他选择提供建议,也许在 C#4 中使用新的动态特性。
我可以向 Customer 添加一个构造函数或属性,它接受一个 Person 并将值分配给基类,例如
public Customer(Person person)
{
base.Name = person.Name;
base.Address = person.Address;
}
或者我可以像这样实现一个不整洁的集合访问器:
public Person Person
{
set
{
Name = value.Name;
Address = value.Address;
}
}
或者我可以像这样将 Person 聚合成 Customer:
public class Customer
{
public Person Person { get; set; }
public string CustomerNumber { get; set; }
public string PaymentTerms { get; set; }
}
最后一个对我来说是最整洁的,除了总是必须,例如访问 Customer.Person.Name
,而不仅仅是 Customer.Name
。
最佳答案
我个人会选择作曲,是的(你最后的选择)。请注意,您始终可以提供“辅助属性”:
public string Name { get { return Person.Name; } }
事实上,您可以对所有您想要的属性执行此操作,并且永远不会将 Person
属性暴露给外界。
另一方面,如果您希望能够将 Customer
视为 Person
- 将其传递给方法,则继承很有用例如,使用 Person
参数。不过,我通常用接口(interface)来完成这类事情;你可以有一个由 Customer
和 Person
实现的 IPerson
接口(interface)。继承引入了各种设计决策,当您不进入继承时,这些决策根本不会出现(或者简单得多)。
关于c# - C# 中的聚合与继承,或替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564226/