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

How to instantiate inherited class using base constructor?

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

使用此设置:

public abstract class parent
{
    protected int x;

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

public class child : parent { }

我有能力做到吗:

child c = new child(2);  

哪个是使用基本构造函数实例化子 class?

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

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

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

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

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

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

我的意思是你可以改变你的方式,喜欢上面的代码;并且不要随心所欲地构造构造函数。

您或许可以使用工厂模式并覆盖 child-classes 中的工厂方法,而不是直接使用构造函数。

谢谢大家的回复。

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

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

所以,对我来说,最终的答案是承认并接受不可避免的事情,那就是你必须为每个 child class 写这个:

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

现在我可以自信地写这段代码了
如果您想知道,这不是关于节省一行代码,而是关于建立编写好代码的标准并避免到处都是不需要的代码行。

我知道您想避免 public child(int x) : base(x) { } 的 "boilerplate",但现实是在某些时候您必须实际编写一些代码。

出于几个非常好的理由,您想要的是不可能的。首先是 children 不会隐式继承 parent 构造函数。这是有充分理由的——否则所有 objects 都会继承 Object 的无参数构造函数。

此外,您甚至不能在抽象 class 上调用 Public 构造函数(它们真的没有多大意义)。