C# 调用第二级基类构造函数

C# 调用第二级基类构造函数,c#,oop,inheritance,encapsulation,C#,Oop,Inheritance,Encapsulation,在C#中,我有一个类,foo,它继承自classbar,而classfoobar 在foo构造函数中,我想直接调用foobar构造函数,而不是通过调用bar构造函数。我试过这样的方法: public foo(int i): base : base(i) 显然,这是行不通的。如果不通过bar构造函数,您将如何使其工作?您不能,因为您不能跳过bar的初始化。您必须在bar中创建一个构造函数来传递参数。原因是bar有责任决定如何构造它的基类。(基类的构造是bar实现的一部分,面向对象的原则之一是封

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

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

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

显然,这是行不通的。如果不通过
bar
构造函数,您将如何使其工作?

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

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

foobar
中创建一个名为initialize的方法,签名将是
voidinitialize(inti)

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


当然,这不会跳过
bar

中的构造函数,我认为您正在尝试从一个不适合这种方式工作的语言特性中获得一些特定的行为。类似于,例如,使用异常来控制正常的应用程序流


也许你可以给我们更多的细节,然后得到一个更适合你的建议。

+1同意bar有责任决定如何建造它。我编写了如下代码,这样您就可以使用默认构造函数(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)
    {

    }
}

+1 bar有责任决定如何构造它的基类。我实际上是在我们的系统中寻找一些非常具体的东西,而不是从另一种语言派生出来的。谢谢你