Ben*_*Ben 2 c# oop design-patterns
假设我有一个客户类型,并且我想为所有客户存储某些信息.但是,客户可以是个人和组织.在每种情况下,我都希望在它们上存储不同类型的信息,并且能够以不同的方式对它们进行操作.
我通常只想处理Customer对象,但在某些时候根据情况处理更具体的类型(例如,在创建地址时我想使用Person的Surname和GivenNames,但是TradingName (但它没有填充OrgName,而不是组织).
我对如何处理这个问题感到很沮丧.我在搜索时发现的示例/问题假设更具体的类型具有相同的属性/方法,因此可以进行一般处理.
我只有一个字段用于我的Customer对象中的任何一个类型,还有一个标志来指示哪个具有值(即isPerson())并在我需要时在我的代码中检查.我是否使用继承,何时需要使用IsType()类型的逻辑?或者是否有一些我缺少的设计模式可以帮助这种类型的场景?
我只有一个字段用于我的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)