隐藏继承类的构造函数
本文关键字:构造函数 继承 隐藏 | 更新日期: 2023-09-27 18:08:50
请看下面的例子:
public class X
{
public X()
{
MessageBox.Show("I'm X");
}
}
public class Y : X
{
public Y()
{
MessageBox.Show("I'm Y");
}
}
当执行命令Y y = new Y();
时,出现两个消息框-首先是"I'm X",然后是"I'm Y"。
我怎样才能摆脱这种行为?当创建新的Y
时,我需要停止X
的构造函数
将调用X的默认构造函数,除非您特别调用不同的构造函数。试试这个:
public class X {
public X() {
MessageBox.Show("I'm X");
}
protected X(int dummy){
}
}
public class Y : X {
public Y() : X(0) { // will call other constructor
MessageBox.Show("I'm Y");
}
}
这将阻止默认构造函数被调用。
然而,根据你的问题-"我需要的是在创建新y时停止X的构造函数",我不确定你是否理解对象继承的基础知识…如果在创建新Y时不想创建新X,为什么要从X导出Y呢?你知道继承是一种关系,对吧?在您的示例中,Y是-a X…
工厂方法:
public class X {
private X() {}
protected virtual void Init(){
MessageBox.Show("I'm X");
}
public static GetX() {
X ret = new X();
ret.Init();
return ret;
}
}
public class Y : X {
private Y() {}
protected virtual void Init(){
MessageBox.Show("I'm Y");
}
public static GetY() {
Y ret = new Y();
ret.Init();
return ret;
}
}
这可以达到目的,不过您可能应该避免在构造函数中执行任何操作。构造函数只能用于初始化。
public class X
{
public X()
{
if (this.GetType() == typeof(X))
{
Console.WriteLine("I'm X");
}
}
public class Y : X
{
public Y()
{
Console.WriteLine("I'm Y");
}
}
class Program
{
static void Main(string[] args)
{
Y y = new Y();
}
}
}
考虑Y
是X
的子类型。更具体地说,Y
需要X
来完成。因此,如果您构建Y
,则需要能够以某种方式创建X
。也就是说,您需要始终调用构造函数,但具体调用哪一个取决于您。你可以通过Luchian的回答中的策略来指定哪一个:
public Y () : X (...)
根据参数选择X
的构造函数