如何使用基础构造函数实例化继承的类?

时间:2015-03-05 09:43:37

标签: c# oop inheritance constructor

我开始相信这是不可能的,但我想看看是否有其他我忽视的东西可以帮助我解决这个问题。

使用此设置:

public abstract class parent
{
    protected int x;

    public parent(int i)
    {
        x = i;
    }
}

public class child : parent { }

我是否有能力这样做:

child c = new child(2);  

哪个使用基础构造函数实例化子类?

我想这样做的原因是我想避免必须为所有派生类实现相同的构造函数,当它们实际上都做同样的事情时,即将值初始化为继承的成员。

我还想避免在每个子实现中写这个:

public child(int i) : base(i) { }

那么,我怎样才能使构造函数可以继承?如果不可能,我该怎么做才能模拟这个?

4 个答案:

答案 0 :(得分:1)

将父级变量x设为public; 所以使用下面的代码:

child c = new child();
c.x = 2;

我的意思是你可以改变自己的方式并喜欢上面的代码;并且不要随意制作构造函数。

答案 1 :(得分:1)

您可以使用工厂模式并覆盖子类中的工厂方法,而不是直接使用构造函数。

答案 2 :(得分:1)

谢谢大家的回复。

从评论和我对此的进一步研究中,我了解到构造函数不可继承有很多原因。其中之一是继承构造函数是一个特定的情况,这可能导致在层次结构中一直继承不需要的构造函数到类object;这也需要额外的代码来隐藏那些不需要的构造函数。所以无论哪种方式,存在额外的代码 - 这是我正在寻找的答案。

我正在寻找的解决方法是创建一个方法,例如SetX(int i),可以在调用无参数构造函数后调用它。但是,这会导致更多的额外代码,因为现在任何实例化的代码都必须调用SetX()

所以,对我而言,最终的答案是承认并接受不可避免的事情,即你必须为每个儿童阶层写下这个:

public child(int i) : base(i) { }  

现在我可以放心地编写这段代码了 如果你想知道,它不是关于保存一行代码,而是关于设置编写良好代码的标准,并避免在整个地方不必要的代码行。

答案 3 :(得分:0)

我知道你想避免使用public child(int x) : base(x) { }的“样板”,但实际情况是,你必须在某种程度上给你写一些代码。

对于一对非常好的理由,你想要的是不可能的。第一个是孩子不会隐式继承父构造函数。这是有充分理由的 - 否则所有对象都将继承Object的无参数构造函数。

此外,您甚至无法在抽象类上调用Public构造函数(实际上并没有太多指向它们)。

相关问题