继承:类型与值

Inheritance: Type vs. Value

关于继承的小问题。我有一个基础 class Baseclass 和两个子 classes Subclass1Subclass2。我在Baseclass中定义了一个ManualResetEvent Mre,用于取消subclasses.

中的方法

在 MainForm 中我这样做:

private Baseclass _baseclass;

private void Start()
{
   if(XYZ)
   {
       var Subclass1 s1 = new Subclass1();
       _baseclass = s1;
       s1.DoCancelableWork();
    }
    else
    {
       var Subclass2 s2 = new Subclass2();
       _baseclass = s2;
       s2.DoCancelableWork();
    }
}

private void Stop()
{
    if(_baseclass != null) _baseclass.Mre.Set();
}

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if(_baseclass != null)
    {
        if(!_baseclass.Mre.WaitOne(0)) Stop();
    }
}

假设 DoCancelableWork() 方法 运行 永久存在,直到它从 Baseclass 继承的 Mre 被设置(我没有定义 Mre再次在 subclasses 中)。当 Stop() 是 运行 时,_baseclass.Mre 现在是指在适当的子 class 中使用的 Mre,所以 DoCancelableWork() 被取消了吗?

。派生 classes 具有基础 class 所做的一切(它实际上具有基础 class 的实例作为它的 "part")。

因此,如果您将派生的 class 实例存储在基础 class 引用中,然后对基础 class 成员执行一些操作 through那个引用,派生的class是仍然指向at/using它(因为它们实际上是同一个对象)。

澄清您的其他问题:

Subclass s = new Subclass(), andBaseclass b = new Subclass(). Is there a clear practical difference?

没有。在功能方面完全没有区别。通过将其存储为派生类型,您可以访问仅限派生的成员,并且可以避免以后进行向下转换。如果您将它存储为基础 class,则意味着您稍后将仅作为基础 class 类型访问它(使用多态性来获取派生的 class 行为)。

Let's say I just had Subclass s1 = new Subclass(), and I never did the _baseclass = s1. Would there be any way to check if the Baseclass has been instantiated (as it has, through the Subclass)?

没有。没有 需要 来检查这样的事情,因为派生的 classes always 的构造函数语义也创建了基础 class.它在可用时使用默认构造函数。如果它不可用,您的派生构造函数必须显式调用所需的基础 class one:

public DerivedClass(string someArg) : base(someArg)
{
}