-1

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

4

3 回答 3

10

否。创建派生类的实例始终为1意味着链接到基类构造函数,无论是显式还是隐式(也可能是间接地,通过派生类中的其他构造函数)。

不过,它不必是无参数的构造函数。例如,您可以:

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好的,可能是由于序列化或其他类似魔法而根本没有调用构造函数的奇怪情况。忽略那些虽然...

于 2013-02-07T16:40:45.940 回答
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;
    }
}
于 2013-02-07T16:40:20.650 回答
0

没有构造函数就不可能实现一个类。即使您没有定义任何内容,默认构造函数也会作为public BaseClass() { }. 一定是因为你无法访问基类中定义的构造函数。现在的问题是您是不想更改基类实现还是根本不想更改。

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

于 2013-02-07T16:48:52.757 回答