我已经做了一些搜索(也许我对我的问题描述得不够好),但是还没有找到答案
假设您有以下POCO:
public class StandardObject
{
public string A {get;set;}
public string B {get;set;}
}
程序中的其他地方有一些处理标准对象的逻辑。
存在一种情况,有时标准对象可能需要以不同的方式处理。我们在创建standardobject时就知道这一点,但是当前的任何属性都不能用于进一步确定这一点。一种方法是在standardobject上添加和设置一个标志或类型enum,并在处理这些对象时检查它。例如。
if(standardObject.IsSpecial){...}
if(standardObject.ObjectType == StandardObjectTypeEnum.Special){...}
不过,这似乎不是最好的方法。
另一个选项是创建派生类:
public class SpecialObject : StandardObject { }
所以现在我们可以检查类型,而不是检查属性。例如。
if(standardObject.GetType() == typeof(SpecialObject)){...}
(根据我们所做的工作,类型检查的实现可能有所不同)
请注意,SpecialObject不会以任何方式添加或更改StandardObject。它本质上是同一个物体。这种方法具有更灵活的优点(例如,我们可以添加一些额外的属性),但实际上它不会改变。总是一样的。
对我来说继承似乎是更好的方法。类型标志看起来像是代码味道,向前继承看起来更像是正确的oop方法。我不确定的是,既然standardobject和specialobject是相同的,那么这样做是不是不好的做法?或者有什么理由可以避免这种情况?
这里有一个类似的问题:
Chess piece hierarchy design: inheritance vs type fields
然而,大多数的讨论似乎集中在象棋问题上,而不是什么被认为是好的设计
编辑:
封装似乎是流行的解决方案。我避免封装的原因最好在下面的示例中描述:
StandardObject本质上是一个DTO
有一个标准对象列表。
列表被处理,标准对象被序列化
序列化的数据通过任意数量的不同协议发送到某个地方
如果标准对象是“特殊的”,其中一个协议要求设置某些参数
考虑到“特殊”情况的附加逻辑仅由处理standardobject的许多不同机制中的一个机制所要求,因此这种逻辑似乎不属于standardobject附近的任何地方
最佳答案
它们都是代码气味。如果在两个相关类型之间必须以不同方式完成特殊处理,请让它们都实现某种虚拟方法或接口操作,从而允许它们处理特殊情况(如果不需要,也可以不这样做)。