C#:我可以在不使用基类的构造函数的情况下创建继承类吗?

时间:2013-02-07 16:36:10

标签: c# inheritance constructor

我需要使用构造函数创建继承类,而不是在 base 类中定义?问题是,继承类中的构造函数需要:base()构造函数吗?如果不更改 base 类的任何组件,如何解决此问题?

3 个答案:

答案 0 :(得分:8)

没有。创建派生类的实例总是 1 意味着明确地或隐式地(并且可能间接地,通过派生类中的其他构造函数)链接到基类构造函数。 / p>

但它不一定是无参数构造函数。例如,您可以:

public class Base
{
    private readonly int id;

    public Base(int id)
    {
        this.id = id;
    }
}

public class Derived : Base
{
    public Derived(int id) : base(id)
    {
    }
}

用于基类构造函数的参数的值不必与参数直接相关。例如,使用与上面相同的基类,您可以:

public class Derived : Base
{
    private readonly string name;

    public Derived(string name) : base(name.Length)
    {
        this.name = name;
    }

    public Derived() : base(-1)
    {
        this.name = null;
    }
}

重要的是每个类都要确保以有效的方式构造它。例如,Base可能会验证id是偶数,或类似的东西 - 如果您在创建派生类的实例时可以绕过该验证,那将是非常糟糕的,因为其余的然后Base中的代码不能依赖它。


1 好的,可能是奇怪的情况,由于序列化或其他类似的魔法,根本没有调用构造函数。忽略那些......

答案 1 :(得分:2)

使用具有不同于基类的构造函数的继承类没有任何问题:

public class Parent
{
    public int Value { get; set; }
    public Parent()
    {
        Value = 5;
    }
}

public class Child : Parent
{
    public string Text { get; set; }
    public Child(string text)
        : base()  //note this line can be omitted; the compiler will add it automatically
    {
        Text = text;
    }
}

答案 2 :(得分:0)

如果没有构造函数,就无法实现一个类。即使您没有定义 any,默认构造函数也可以作为public BaseClass() { }。这一定是因为您无法访问基类中定义的构造函数。现在的问题是你是否想要改变基类实现,或者你根本不想改变它。

您需要将基类构造函数(可能是私有或内部)的访问修饰符更改为受保护公共