假设我有一个名为SuperClass
的班级和一个名为SubClass
的班级。 SubClass
从SuperClass
延伸。在SuperClass
的定义中,我有一个方法,打算检查this
类是SubClass
的实例。
if (this.GetType() == typeof(SubClass))
log.Info("This SuperClass is a SubClass");
else
log.Info("This SuperClass is NOT a SubClass");
这很有效,但是当事情正常时(特别是在第一次尝试时),我总是非常怀疑。我想确保这是做我想做的最好的方法(最安全,最可读,最正确)。
答案 0 :(得分:4)
我认为你只是在寻找is
operator:
if (this is SubClass)
特别是,如果this
是SubClass
的子类的实例,那么这也将继续。
如果您希望使用 this
作为SubClass
,例如要获得SubClass
中声明的成员,您还应该考虑as
operator:
SubClass sub = this as SubClass;
if (sub != null)
{
// Use sub here
}
如果您想检测到this
是的确实 SubClass
的实例(而不是其他派生类型),那么您所获得的检查已经是正确的
一句警告:在执行时检查类型的需要通常是一种设计气味。考虑是否有其他方法可以实现您的目标。有时会有(例如通过在基类中引入一个新的虚拟或抽象成员),有时候却没有......但总是值得考虑。
答案 1 :(得分:2)
这样可以工作,但你已经将你的超级和子类联系在一起,超级人员真的不应该知道这个子。在超类上创建一个虚拟方法,sub将覆盖它以执行实际工作。您可以从超类的内部或外部调用此方法来完成所需的工作。如果需要在超类的成员上完成工作,那么让它们受到保护,以便子类可以访问它们。
让我在需要检查对象类型的任何时候添加几乎,你没有正确地进行面向对象编程,并且有更好的设计可以找到。通常,它是需要执行类型检查类正在尝试的工作的子类。