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

问题描述 投票:2回答:3
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()时,它会重定向到child的无参数构造函数。

c# .net inheritance constructor virtual
3个回答
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
投票

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


0
投票

尝试将值分配给ThingsIWant中的只读字段

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

旧的msdn document说:

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

© www.soinside.com 2019 - 2024. All rights reserved.