继承:类型与值

时间:2015-03-23 19:51:18

标签: c# inheritance

关于继承的快速问题。我有一个基类Baseclass和两个子类Subclass1Subclass2。我在ManualResetEvent Mre中定义了Baseclass,用于取消子类中的方法。

在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()方法永久运行,直到它从Mre继承Baseclass为止(我没有在子类中再次定义Mre)。运行Stop()时,_baseclass.Mre现在是否会引用相应子类中使用的Mre,因此会取消DoCancelableWork()

1 个答案:

答案 0 :(得分:1)

即可。派生类具有基类所做的一切(它实际上有一个基类的实例作为它的“部分”)。

因此,如果将派生类实例存储在基类引用中,然后对基类成员通过引用该引用,则派生类仍然指向在/使用它(因为它们实际上是同一个对象)。

澄清您的其他问题:

  

Subclass s = new Subclass()Baseclass b = new Subclass()。是   有明显的实际差异吗?

没有。在功能方面没有任何区别。通过将其存储为派生类型,您可以访问仅派生成员,并可以避免以后向下转发。如果将它作为基类存储,则暗示您以后只能将其作为基类类型访问(使用多态来获取派生类的行为)。

  

假设我刚刚Subclass s1 = new Subclass(),我从未这样做过   _baseclass = s1。有没有办法检查是否   Baseclass已经实例化(因为它通过Subclass)?

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

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