2012-08-30 101 views
2

在C#中,我有一个类foo,它继承自类bar,它继而从类foobar继承。调用二级基类构造函数

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

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

显然这是行不通的。如何在不通过bar构造函数的情况下使其工作?

回答

11

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

+3

** + 1 **决定_it的酒吧的责任是如何想它的基类中constructed._ –

1

采取任何共享的逻辑要执行出来的foobar构造函数。

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

呼叫从构造这种方法foo

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

0

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

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

+0

我实际上是在寻找一些在我们的系统中非常具体的东西,而不是来自不同的语言。不管怎么说,多谢拉 – jbkkd

0

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

    } 
}