子类检查,是运算符或枚举检查

时间:2009-11-16 10:00:02

标签: c# inheritance enums typechecking

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

替补1。

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

Check: If (myobj is PDF)

替补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 个答案:

答案 0 :(得分:3)

为什么你首先需要知道?我同意它偶尔是必要的,但在可能的情况下,您应该使Document类型具有适当的抽象功能,以允许通过继承来完成特化,而不是调用者必须以不同方式对待它。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我目前正在思考的另一种方法是使用interface属性将类型作为STRING返回。它对于类型检查并不好,但我的其余代码都有必要的验证来防止流氓DocumentType对象。我更喜欢不同的解决方案,但没有想到任何事情。