2011-01-31 52 views
6

似乎没有用于指定this()和base()构造函数的语言语法。给定以下代码:C#中的this()和base()构造函数

public class Bar : Foo 
{ 
    public Bar() 
     :base(1) 
     //:this(0) 
    { } 
    public Bar(int schmalue) 
     :Foo(1) 
    { 
     //Gobs of initialization code 
     ... 
     Schmalue = schmalue; 
    } 

    public int Schmalue { get; private set; } 
} 

public class Foo 
{ 
    public Foo() 
    { 
     Value = 0; 
    } 

    public class Foo(int value) 
    { 
     Value = value; 
    } 

    public int Value { get; private set; } 
} 

编译器给了我一个错误,指出取消注释this(0)时需要注意'{'。这很麻烦,因为这会导致我将我的代码分解为私有方法,当这种功能被明确提供以防止出现这种情况时。

我只是做了这个错误?我试过没有分隔符,分号,逗号......似乎这只是开发团队的疏忽而已。我感兴趣的是为什么这个被省略,如果我以错误的方式去解决这个问题,或者如果有人对替代方案有很好的建议。

+1

[在C#中调用Overriden构造函数和基构造函数]可能的副本(http://stackoverflow.com/questions/335286/calling-overriden-constructor-and-base-constructor-in-c) – Oded 2011-01-31 19:16:58

+2

谢谢大家的答案。本质上,问题是this()也可能调用另一个基构造器。 – Sprague 2011-01-31 19:35:49

回答

8

您可以在您的链的末端调用基类的构造实现这一点:

public Bar(): this(0) {} 
public Bar(int schmalue): base(1) { 
    // ... initialize 
} 
3

不,您只能链接到一个构造函数 - 在同一个类中的另一个构造函数或基础构造函数。

这是不是很清楚你想要做什么。通常我发现在派生类中创建一个“主要”构造函数是值得的:派生类中的所有其他构造函数都使用“this”来调用主函数,它调用“base”来调用适当的基构造函数。

虽然这种模式不适合场景 - 特别是当你想从不同来源的构造函数调用不同的基础构造 - 它是通常一个很好的模式。

1

在您的设计中,我看不到BarFoo类之间的许多常见事物。为什么FooBar派生?当你重新实现一切时?这两个类都有一个带有公共getter和private setter的整数属性,并且这两个类都有默认的构造函数和一个允许初始化整数属性的构造函数。那么为什么这两个类都存在呢?

0

在酒吧的第二个构造函数是完全错误的。尝试:

public Bar(int schmalue) 
    :base(1) //would call Foo(1) 
{ 
    //Gobs of initialization code 
    ... 
    Schmalue = schmalue; 
} 

在第一构造函数的评论似乎意味着像与schmalue

  • 初始化酒吧= 0

  • 调用基构造函数美孚与值= 1

对不对?

为了做到这一点,更换第二构造函数,只需添加一个(私人)构造函数,可以同时处理值

public Bar(int schmalue) 
    :this(1, schmalue) //would call Bar(1, schmalue) 
{ 
} 

private Bar(int value, int schmalue) 
:base(value) 
{ 
    //Gobs of initialization code 
    ... 
    Schmalue = schmalue; 
} 
3

考虑,如果你可以打电话给两个thisbase的构造函数在一个构造函数中会发生什么。我们假设首先调用基础构造函数。然后,将调用构造函数this - 它本身将调用基础构造函数。因此,基类将被实例化两次。这打破了构造函数的语义 - 即一个对象被构造一次。

因此,拨打basethis是禁止的。如果需要,让您的委托构造函数调用具有特定参数的基础。