在C#中,我有一个类foo
,它继承自类bar
,它继而从类foobar
继承。调用二级基类构造函数
在foo
构造函数中,我想直接调用foobar
构造函数,而不是调用bar
构造函数。我试过这样的:
public foo(int i): base : base(i)
显然这是行不通的。如何在不通过bar
构造函数的情况下使其工作?
在C#中,我有一个类foo
,它继承自类bar
,它继而从类foobar
继承。调用二级基类构造函数
在foo
构造函数中,我想直接调用foobar
构造函数,而不是调用bar
构造函数。我试过这样的:
public foo(int i): base : base(i)
显然这是行不通的。如何在不通过bar
构造函数的情况下使其工作?
你不能,因为你不能跳过酒吧的初始化。你必须在bar中创建一个构造函数来传递参数。原因在于,酒吧有责任决定如何构建其基类。 (基类的构造是酒吧的实施的一部分,和面向对象的原则之一就是封装 - 隐藏实现到外面)
采取任何共享的逻辑要执行出来的foobar
构造函数。
创建foobar
名为initialize的方法,签名会void initialize(int i)
呼叫从构造这种方法foo
。
当然,这不会跳过bar
中的构造函数。
我认为你正试图从一种语言功能中获得一些特定的行为,而这种功能并不是以这种方式工作的。例如,类似于使用异常来控制正常的应用程序流。
也许你可以给我们更多的细节,然后得到一个更适合你想要做的建议。
我实际上是在寻找一些在我们的系统中非常具体的东西,而不是来自不同的语言。不管怎么说,多谢拉 – jbkkd
+1同意酒吧的责任,决定如何构建它。我出来的代码像下面这样你可以使用默认的构造函数(条),并允许重写构造
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)
{
}
}
** + 1 **决定_it的酒吧的责任是如何想它的基类中constructed._ –