查看超类的当前实例是否是该超类内部的子类的正确方法

本文关键字:超类 子类 内部 方法 实例 是否是 | 更新日期: 2023-09-27 18:02:40

假设我有一个名为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");

这是有效的,但我总是非常怀疑当一些工作正确(特别是在第一次尝试)。我想确保这是做我想做的事情的最佳方式(最安全,最易读,最正确)。

查看超类的当前实例是否是该超类内部的子类的正确方法

我想你只是在寻找is运算符:

if (this is SubClass)

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

如果你想使用 this作为SubClass,例如获取在SubClass中声明的成员,你也应该考虑as操作符:

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

如果您想检测this的一个实例,正好是 SubClass(而不是进一步的派生类型),那么您得到的检查已经是正确的。

一个警告:需要在执行时检查类型通常有点设计味道。想想是否有其他方法可以实现你的目标。有时有(例如,通过在基类中引入新的虚成员或抽象成员),有时没有……但这总是值得思考的。

这将工作,但你耦合了你的父类和子类,其中父类确实不应该知道子。在父类上创建一个虚方法,子类将覆盖它来完成实际的工作。您可以从超类内部或外部调用此方法来完成所需的工作。如果工作需要在超类的成员上完成,那么将它们保护起来,以便子类可以访问它们。

让我补充一下几乎任何时候你需要检查对象的类型,你都没有正确地进行面向对象编程,有一个更好的设计可以找到。通常是子类需要做类型检查类尝试做的工作。