C#中的聚合与继承

Pro*_*ofK 2 .net c# oop

假设我有以下两个类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我有一个我想成为客户的人,据我所知,我有三个选项,我希望得到关于哪个是最好的以及任何其他选项的建议,也许使用新的C#4中的动力学东西.

我可以向Customer添加构造函数或属性,它接受Person并将值分配给基类,例如

public Customer(Person person)
{
    base.Name = person.Name;
    base.Address = person.Address;
}
Run Code Online (Sandbox Code Playgroud)

或者我可以像这样实现一个不整洁的set访问器:

public Person Person
{
    set
    {
        Name = value.Name;
        Address = value.Address;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者我可以将Person聚合到客户中,如下所示:

public class Customer
{
    public Person Person { get; set; }
    public string CustomerNumber { get; set; }
    public string PaymentTerms { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

最后一个对我来说是最好的,除了总是不得不访问Customer.Person.Name,而不仅仅是Customer.Name.

Jon*_*eet 5

我个人会去作曲,是的(你的最后一个选择).请注意,您始终可以提供"帮助属性":

public string Name { get { return Person.Name; } }
Run Code Online (Sandbox Code Playgroud)

实际上,您可以为所需的所有属性执行此操作,并且永远不会将Person属性暴露给外部世界.

另一方面,如果您希望能够将a 作为a - 将其传递给具有参数的方法,则继承非常有用.我通常用接口完成那种事情; 你可以有两个和两个实现的接口.继承引入了各种设计决策,当你没有进行继承时,这些决策根本就没有出现(或者更简单).CustomerPersonPersonIPersonCustomerPerson