调用第二级基类构造函数

时间:2012-08-30 12:42:07

标签: c# oop inheritance encapsulation

在C#中,我有一个类foo,它继承自类bar,后者继承自类foobar

foo构造函数中,我想直接调用foobar构造函数,而不是调用bar构造函数。我试过这样的事情:

 public foo(int i): base : base(i)

显然这不起作用。如果不通过bar构造函数,你将如何使它工作?

4 个答案:

答案 0 :(得分:11)

你不能,因为你不能跳过bar的初始化。你必须在bar中创建一个构造函数来传递你的参数。原因在于决定如何构建基类是有责任的。 (基类的构造是bar的实现的一部分,面向对象的原则之一是封装 - 将实现隐藏到外部。)

答案 1 :(得分:1)

foobar构造函数中获取要执行的任何共享逻辑。

foobar中创建一个名为initialize的方法,签名为void initialize(int i)

foo中的构造函数调用此方法。

当然,这不会跳过bar中的构造函数。

答案 2 :(得分:0)

我认为你试图通过一种不是那种方式工作的语言功能来获得一些特定的行为。类似于,例如,使用异常来控制正常的应用程序流。

也许您可以向我们提供更多详细信息,然后获得更适合您尝试的建议。

答案 3 :(得分:0)

+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)
    {

    }
}