【发布时间】:2014-06-12 22:32:55
【问题描述】:
假设我有一个名为Shape 的基类,我希望每个形状都能够返回它们自己的区域。我可以将Shape 设为接口或抽象类(可能还有其他方式),但最终结果是每个形状都有一个名为Area 的函数。
假设我有一个类似的集合:
List<Shape> bag = loadShapesFromXML(...)
如果我想将所有区域加在一起,我可以这样做:
int total=0;
foreach (var s in bag)
total += s.Area();
这遵循开/关原则就好了。我遇到的问题是loadShapesFromXML。假设我的 XML 如下所示:
<bag>
<circle id="1" radius="5" />
<square id="2" length="3" />
<rectangle id="3" length="6" width="7"/>
</bag>
我的loadShapesFromXML 方法必须检查“包”中的每个项目以查看它的形状类型。除了使用反射来查看形状的类型是圆形/正方形/矩形之外,我还能做些什么来避免每次决定添加新形状时都修改这个函数?
【问题讨论】:
-
如果你用序列化器加载它们,这个问题应该会消失。这不是一个选择吗?
-
如果您正在寻找通用指南(基于标题),向programmers.stackexchange.com 提出更好的问题。否则请查看en.wikipedia.org/wiki/Data_mapper_pattern
-
@BradletDotNET 问题将如何消失?它仍然需要根据派生的
Shape类型的每个特定实现来计算形状,不是吗? -
您有什么理由限制自己不使用反射?使用使用反射的第三方库怎么样?
-
@YuvalItzchakov,他担心使用反射来获取类型。通过使用序列化程序,它将自动序列化为正确的类型(可能使用幕后的反射授予)。不过,他不必为新类型修改函数。
标签: c# solid-principles