继承:类型与值
Inheritance: Type vs. Value
关于继承的小问题。我有一个基础 class Baseclass
和两个子 classes Subclass1
和 Subclass2
。我在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)
{
}
关于继承的小问题。我有一个基础 class Baseclass
和两个子 classes Subclass1
和 Subclass2
。我在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)
{
}