正确的方法来查看超类的当前实例是否是超类中的子类

时间:2014-05-09 16:24:14

标签: c# .net inheritance

假设我有一个名为SuperClass的班级和一个名为SubClass的班级。 SubClassSuperClass延伸。在SuperClass的定义中,我有一个方法,打算检查this类是SubClass的实例。

if (this.GetType() == typeof(SubClass))
    log.Info("This SuperClass is a SubClass");
else
    log.Info("This SuperClass is NOT a SubClass");

这很有效,但是当事情正常时(特别是在第一次尝试时),我总是非常怀疑。我想确保这是做我想做的最好的方法(最安全,最可读,最正确)。

2 个答案:

答案 0 :(得分:4)

我认为你只是在寻找is operator

if (this is SubClass)

特别是,如果thisSubClass的子类的实例,那么这也将继续。

如果您希望使用 this作为SubClass,例如要获得SubClass中声明的成员,您还应该考虑as operator

SubClass sub = this as SubClass;
if (sub != null)
{
    // Use sub here
}

如果您想检测到this的确实 SubClass的实例(而不是其他派生类型),那么您所获得的检查已经是正确的

一句警告:在执行时检查类型的需要通常是一种设计气味。考虑是否有其他方法可以实现您的目标。有时会有(例如通过在基类中引入一个新的虚拟或抽象成员),有时候却没有......但总是值得考虑。

答案 1 :(得分:2)

这样可以工作,但你已经将你的超级和子类联系在一起,超级人员真的不应该知道这个子。在超类上创建一个虚拟方法,sub将覆盖它以执行实际工作。您可以从超类的内部或外部调用此方法来完成所需的工作。如果需要在超类的成员上完成工作,那么让它们受到保护,以便子类可以访问它们。

让我在需要检查对象类型的任何时候添加几乎,你没有正确地进行面向对象编程,并且有更好的设计可以找到。通常,它是需要执行类型检查类正在尝试的工作的子类。