【问题标题】:Is it possible to make a derived class inherit a non-0 argument constructor?是否可以使派生类继承非 0 参数构造函数?
【发布时间】:2011-02-11 06:50:30
【问题描述】:

my last question 的基础上,是否可以让派生类继承其基类的构造函数?例如,如果我这样定义两个类:

class Base {
    public Base(){}
}

public Derived() {
}

派生类实例化时会自动调用基类的构造函数。如果我向基类添加另一个构造函数,

class Base {
    public Base(int x){}
}

是否可以使用 that 构造函数来构造 derived 类?我的意思是不必添加类似的东西

public Derived() {
     public Derived(int x) : base(x) {}
}

【问题讨论】:

    标签: c# constructor


    【解决方案1】:

    不,不是。您必须明确添加它们; only 默认是调用base() 的无参数构造函数,如果你不添加任何构造函数,你会得到它。在某些情况下可能会很好(尤其是当基础上有很多构造函数时),我想象有一些工具(可能是 R#?我还没有检查过)可能有助于自动化它 - 但没有内置任何东西。

    【讨论】:

    • 啊。我问是因为我正在构建一个 API,用户将在其中定义派生类,但我希望它们以特定方式构建。不过没关系...我将只使用在构造对象后立即调用的 setter。
    【解决方案2】:

    有点……

    class Base {
        protected Base() : this(default(int)) {}
        public Base(int x){}
    }
    
    public Derived() {
    }
    

    将强制Derived 使用参数的默认值调用重载的构造函数。不过,这可能是也可能不是您想要发生的事情。通过将默认构造函数标记为protected,您可以防止外部调用者使用默认构造函数进行实例化,但允许派生类这样做。

    【讨论】:

    • 没有帮助,不幸的是。默认值不好,我需要传入在运行时确定的东西,并且我想确保派生类有一个可以接受它的构造函数。
    • @Mark 然后完全忘记设置器并强制从Base 继承的用户调用正确的基本构造函数。这是定义明确的预期行为!不要冒构建无效对象的风险。 public Derived(int x) : base(x) {} 正是您想要的,也是大多数开发人员所期望的。
    • 我为什么要强制用户将精确的 sn-p 代码添加到他们的每个类中?而且我没有任何风险,因为 我是 构造类的人,所以我可以立即调用 setter 后缀,将其置于有效状态,而我不必运行这种风险是因为用户不必自己调用它,而他们可能会忘记包含该构造函数,或者更糟糕的是,错误地实现了它。
    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2015-11-03
    • 1970-01-01
    • 2013-01-24
    • 2013-04-05
    相关资源
    最近更新 更多