2009-11-16 82 views
0

一些朋友正在讨论继承的使用以及如何检查子类是否属于特定类型,并且我们决定将它在此处发布在Stack上。辩论的是如果你应该在基类中实现一个抽象枚举来检查子类的类型,或者你应该使用is运算符。子类检查,是运算符还是枚举检查

备选1

public abstract class Document{ 
} 
public class PDF:Document{ 
} 

Check: If (myobj is PDF) 

Alt键2.

public abstract class Document{ 
    public abstract DucumentType TypeOfDocument {get;} 
} 
public class PDF:Document{ 
    public DucumentType TypeOfDocument { get{return DucumentType.PDF };} 
} 
public enum DucumentType{ 
    PDF, Word 
} 

Check: If (myobj.TypeOfDocument == DucumentType.PDF) 

的那些为ALT1。认为Alt2略微打破SRP,你不会利用OO,你重复抽象。因为继承是类之间最难联系的事情,所以你无法避免知道它们,并且如果你必须通过继承来减少影响。 Alt2也打破DRY

对于Alt2的那些,Alt2将完全删除类型检查,并将它替换为检查此枚举的选项。去除所有子类的所有硬连接,并且枚举本身的值并没有说明当前正在执行哪个具体实现。

你对这两种选择有什么看法?

没有讨论继承与组合等,这是另一个问题!

回答

3

为什么你首先需要知道?我同意偶尔有必要,但在可能的情况下,您应该让Document类型具有适当的抽象功能,以便通过继承完成专业化,而不是调用方对其进行不同的处理。

如果不同的子类可以共享文档类型但只想分享继承层次结构,我只会使用枚举方法。这将是非常罕见的,IME。

0

IMO你应该使用is运算符。 它给你相同的结果,而不会污染(抽象)类代码。

0

我有类似的情况,除了在我的情况下,DocumentType枚举需要随着各种类型的增加而增长。通过使用Enum,类型检查要好得多,但它要求每次添加新的DocumentType时重新编译“通用”基类。

我目前正在思考的另一种选择是使用接口属性将类型作为字符串返回。这对于类型检查来说并不好,但我的代码的其余部分具有防止流氓DocumentType对象的必要验证。我宁愿有一个不同的解决方案,但没有想到。