关于继承的快速问题。我有一个基类Baseclass
和两个子类Subclass1
和Subclass2
。我在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()
?
答案 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)
{
}