我有许多类在概念上都是相关的,但在细节层面上比其他类更多。例如,这三个类具有几乎相同的属性(尽管成员函数会有所不同):
public class RelatedA : IRelatedType
{
public string Name { get; set; }
public string Value { get; set; }
public DateTime Stamp { get; set; }
}
public class RelatedB : IRelatedType
{
public string Name { get; set; }
public string Value { get; set; }
public DateTime Stamp { get; set; }
}
public class RelatedC : IRelatedType
{
public string Name { get; set; }
public string Value { get; set; }
public DateTime Stamp { get; set; }
public int Special { get; set; }
}
还有一些其他类在概念上与上述3相关,但在实现方面可能有点不同:
public class RelatedD : IRelatedType
{
public string Name { get; set; }
public string Statement { get; set; }
}
public class RelatedE : IRelatedType
{
public string Name { get; set; }
public string Statement { get; set; }
public bool IsNew { get; set; }
}
这些实例可以由工厂根据某种“类型”枚举值创建。问题是,稍后当使用这些对象时(例如在业务层中),可能会有很多这样的代码:
IRelatedType theObject = TheFactory.CreateObject(SomeEnum.SomeValue);
if (theObject is RelatedC)
{
RelatedC cObject = theObject as RelatedC;
specialVal = cObject.Special;
}
else if (theObject is RelatedD)
{
RelatedD dObject = theObject as RelatedD;
statementVal = dObject.Statement;
}
else if (theObject is RelatedE)
{
RelatedE eObject = theObject as RelatedE;
statementVal = eObject.Statement;
isNewVal = eObject.IsNew;
}
这可以在很多地方重复。是否有更好的方法来设计我应该使用的(必须有)?
答案 0 :(得分:1)
您可以尝试将差异分解为单独的类,然后提供这些类,例如:
IRelatedType theObject = TheFactory.CreateObject(SomeEnum.SomeValue);
RelatedTypeHelper theHelper=TheFactory.CreateHelper(theObject);
theHelper.DoSpecialThing(theObject);
现在你不必拥有所有if else块,并且如果你添加一个需要新处理的新类型,你只需要一个新的帮助器实现所需的部分,你应该很高兴。帮助者应该帮助记录这个过程。
我还会质疑为什么单个方法对specialVal和StatementVal有这么不同的实现可能是你的样本,但它让我很好奇你在这里做了什么。你可以简化一些事情,回过头来质疑这些被包含在这个特定层次结构中的重点。