C#使用当前类的参数和无参数构造函数调用基础构造函数

时间:2017-12-20 12:33:18

标签: c# .net inheritance constructor virtual

public class A
{
    public A() { Console.WriteLine("A parameterless"); }
    public A(int a) : this() { Console.WriteLine("A with a"); }
}

public class B : A
{
    public B() { Console.WriteLine("B paramterless"); }
    public B(int b) : base(b) { Console.WriteLine("B with b"); }
}

public class Program
{
    public static void Main(string[] args)
    {
        new B(3);
    }
}

给出:
无参数
A带有 B与b

我可以做什么来调用" B无参数"还有?
所以,我需要的是:

public B(int b) : base(b), this() { ... }

或者,一个虚构造函数,这样当基类调用this()时,它会重定向到子的无参数构造函数。

3 个答案:

答案 0 :(得分:1)

你不能用构造函数链接来做。但我没有看到任何问题:

public class A
{
    public A()
    {
        Console.WriteLine("A parameterless");
    }
    public A(int a) : this()
    {
        Console.WriteLine("A with a");
    }
}

public class B : A
{
    public B()
    {
        ThingsIWant();
    }
    public B(int b) : base(b)
    {
        ThingsIWant();
        Console.WriteLine("B with b");
    }

    protected void ThingsIWant()
    {
        Console.WriteLine("B paramterless");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        new B(3);
    }
}

答案 1 :(得分:1)

我将延伸“不能”的答案并添加“不应该”。多个构造函数重载的用例是接收与对象构造相关的不同输入,通常具有接收较少信息的构造函数为提供给其他构造函数的值提供适当的默认值。从可维护性的角度来看,通常情况下,包含最详细参数的重载是真实构造逻辑存在的唯一位置,并且其他构造函数会调用该构造逻辑。

答案 2 :(得分:0)

  

尝试在ThingsIWant

中为只读字段指定值

这是一种语言/编译器限制:编译器允许您在构造函数内仅更改物理的只读字段,而不是在对象的构造期间调用的方法中。

旧的msdn document州:

  

"当字段声明包含只读修饰符时,声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中出现。"