c# - C# 中的聚合与继承,或替代方案

标签 c# .net 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; }
}

现在,如果我想成为某个人的客户,据我所知,我有三个选择,我希望就哪个最好以及任何其他选择提供建议,也许在 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)来完成这类事情;你可以有一个由 CustomerPerson 实现的 IPerson 接口(interface)。继承引入了各种设计决策,当您不进入继承时,这些决策根本不会出现(或者简单得多)。

关于c# - C# 中的聚合与继承,或替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564226/

相关文章:

c# - 从主 UI 线程上的按钮挂起子线程

C# 非常动态的调用

python - 如何增加一个值并重置另一个值。 PYTHON

c# - 使用 C# 在 asp.net 中设置每行的最小字符数限制

C# DLLImport 'Complex' 数组返回和参数

C# 销毁对象及其所有引用

c# - .Net 中的定时器和循环是否准确?

c# - CaSTLe 动态代理 + Ninject as DI 的问题

java - 组合与减少耦合?

php - 这是一个安全的 OO php 数据库连接还是浪费代码