无意的基类构造函数"隐藏"在派生类

时间:2016-02-28 23:54:49

标签: c# inheritance constructor unity5

[注意:编写的代码仅用于显示问题,而不是因为它具有固有的用途。]

我们说我有两个班级AB

public class A {

    public const int max = 2;
    public int[] id;

    public A() {
        this.id = new int[A.max];
    }

    public A(int id) : this() {
        this.id[0] = id;
    }

    public A(int id, int id2) : this() {
        this.id[0] = id;
        this.id[1] = id2;
    }
}

public class B : A {

    public B(int[] ids) : base() {
        int x = 0;
        while ( ( x < ids.Length ) && ( x < A.max ) ) {
            this.id[x] = ids[x];
            x++;
        }
    }
}

似乎通过在B中创建新的构造函数,我无意中隐藏了通常会继承的所有构造函数&#34;来自B的{​​{1}}(事实上,我已经了解到构造函数不会在C#中继承,但我仍然在这里感到困惑。)

例如:

A

如果我从A first = new A(); // fine int[] x = new int[A.max-1]; B second = new B(x); // fine B third = new B(12); // nope 删除新的构造函数,那么B就可以正常工作(在我的术语中,构造函数不是&#34; t&#34;隐藏&#34;再也是)。但是使用B third = new B(12);中的新构造函数,B构造函数不再适用于我。

真的解决方案是否只需重新定义 ALL 我希望B从A继承并使其为空的构造函数?例如:

A(int)

如果我进行了更改,现在public class B : A { public B(int id) : base(id) {} // adding this! public B(int[] ids) : base() { int x = 0; while ( ( x < ids.Length ) && ( x < A.max ) ) { this.id[x] = ids[x]; } } } 工作正常。但是,我必须重新定义我想要在派生类的基类中使用的每个构造函数,这似乎有点难看,只是因为我在这个派生类中添加了一个新的构造函数!

2 个答案:

答案 0 :(得分:3)

是的,派生类不会从基类中获取或公开构造函数。您需要在基类中定义所有必需的构造函数(可能调用基类'构造函数)。

注意:如果你派生的类没有什么可以初始化的话,你可能想重新考虑一下你是否真的需要新的课程。

答案 1 :(得分:0)

我认为你是绝对正确的EleventyOne你的例子很笨重,但问题不在于你的设计语言。我知道你的例子不是一个现实世界的例子,因此抽象的问题会产生抽象的答案。

如果您发现自己的基类很多构造函数,那么您的设计是错误的。你可能试图在继承中建模更适合于组合的东西,或者你的基类应该接受一个对象而不是单独的相关属性,如果属性不相关那么你的基类可能做得太多了(单一责任原则)。

如果感觉不对,你会有代码味道! :)