在 C# 中,我有一个类 ,foo
它继承自 class bar
,而后者又继承自 class foobar
。
在foo
构造函数中,我想foobar
直接调用构造函数,而不是从调用bar
构造函数。我试过这样的事情:
public foo(int i): base : base(i)
显然这是行不通的。在不通过bar
构造函数的情况下,您将如何使其工作?
在 C# 中,我有一个类 ,foo
它继承自 class bar
,而后者又继承自 class foobar
。
在foo
构造函数中,我想foobar
直接调用构造函数,而不是从调用bar
构造函数。我试过这样的事情:
public foo(int i): base : base(i)
显然这是行不通的。在不通过bar
构造函数的情况下,您将如何使其工作?
你不能,因为你不能跳过 bar 的初始化。您必须在 bar 中创建一个构造函数来传递您的参数。原因是 bar 有责任决定如何构造它的基类。(基类的构建是bar实现的一部分,面向对象的原则之一就是封装——将实现隐藏在外面。)
从构造函数中取出您想要执行的任何共享逻辑foobar
。
在调用初始化中创建一个方法foobar
,签名将是void initialize(int i)
从 中的构造函数调用此方法foo
。
当然,这不会跳过bar
.
我认为您正在尝试从并非旨在以这种方式工作的语言功能中获得一些特定行为。有点类似于,例如,使用异常来控制正常的应用程序流。
也许您可以向我们提供更多详细信息,然后获得更适合您正在尝试做的事情的建议。
+1 同意酒吧有责任决定如何构建它。我出来的代码如下所示,因此您可以使用默认构造函数(bar)并允许覆盖构造函数
public class bar
{
// Original constructor
int value { get; set; }
public bar(int i)
{
this.value = i;
}
}
public abstract class foobar : bar
{
int value {get; set;}
protected foobar(int i) : base(i)
{
value = i;
}
}
public class foo : foobar
{
// New constructor
protected foo(int i)
: base(i)
{
}
}