当一个类型可以是两个不同的东西之一时的设计选项

Ben*_*Ben 2 c# oop design-patterns

假设我有一个客户类型,并且我想为所有客户存储某些信息.但是,客户可以是个人和组织.在每种情况下,我都希望在它们上存储不同类型的信息,并且能够以不同的方式对它们进行操作.

我通常只想处理Customer对象,但在某些时候根据情况处理更具体的类型(例如,在创建地址时我想使用Person的Surname和GivenNames,但是TradingName (但它没有填充OrgName,而不是组织).

我对如何处理这个问题感到很沮丧.我在搜索时发现的示例/问题假设更具体的类型具有相同的属性/方法,因此可以进行一般处理.

我只有一个字段用于我的Customer对象中的任何一个类型,还有一个标志来指示哪个具有值(即isPerson())并在我需要时在我的代码中检查.我是否使用继承,何时需要使用IsType()类型的逻辑?或者是否有一些我缺少的设计模式可以帮助这种类型的场景?

Eri*_* J. 5

我只有一个字段用于我的Customer对象中的任何一个类型,还有一个标志来指示哪个具有值(即isPerson())并在我需要时在我的代码中检查.我是否使用继承,何时需要使用IsType()类型的逻辑?

不,这违背了多态的目的.

定义一个接口,捕获两个类的共同点,这样您就可以在适当的时候以相同的方式处理它们.您很可能还希望创建一个至少实现某个接口的公共基类,从而提供常见的行为.您最终可能会将某些接口实现作为抽象方法,从Person和Organization子类中获取具体实现.

糟糕的设计

public class Customer
{
    public void DoSomethingCustomersDo()
    {
        if (isPerson())
        {
            /* Person implementation */
        }
        else
        {
            /* Organization implementation */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更好的设计

public interface ICustomer
{
    void DoSomethingCustomersDo();
}

public abstract class Customer : ICustomer
{
    public string SomeSharedProperty { get; set; }

    public abstract void DoSomethingCustomersDo();
}


public class Person : Customer
{
    public override void DoSomethingCustomersDo()
    {
        /* Person implementation */
    }
}

public class Organization : Customer
{
    public override void DoSomethingCustomersDo()
    {
        /* Organization implementation */
    }
}
Run Code Online (Sandbox Code Playgroud)