【问题标题】:How to instantiate inherited class using base constructor?如何使用基构造函数实例化继承的类?
【发布时间】:2015-05-06 15:07:07
【问题描述】:

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

使用此设置:

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) { }

那么,我怎样才能让构造函数可以继承呢?如果不可能,我该如何模拟呢?

【问题讨论】:

  • 不,你不能那样做
  • 不,如果您尝试编译器会报告错误,说明“在基类中未找到重载默认构造函数”之类的内容,则不能!
  • 你为什么要避免这样写?如果纯粹是因为您不想输入它,请投资像 Resharper 之类的东西 - 它会在几次击键中为您编写。
  • 如果你不想避免智利的实施,我认为你不能。
  • 那不行;这意味着每个类都有一个无参数构造函数,派生自System.Object

标签: c# oop inheritance constructor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    感谢大家的回复。

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

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

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

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

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

    【讨论】:

    • 我认为“好的代码”不是关于最少的行数。我的意思是,是的,减少绒毛并用几行代码简洁是好的。但这都应该服务于可读性和简洁性的目标。 public child(int i) : base(i) { } 将被任何程序员立即阅读和理解。我保证你可能发现的任何其他方法都不会那么糟糕。
    【解决方案3】:

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

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

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

    【讨论】:

    • 虽然这是一个很好的解决方法,但我的意思是 xprotected。感谢您的回答;请保留它以供未来的人们跳出框框思考。我已经相应地编辑了我的问题。
    【解决方案4】:

    我知道您想避免使用 public child(int x) : base(x) { } 的“样板”,但现实情况是在某些时候您必须实际编写一些代码。

    你想要的东西是不可能的,有几个很好的理由。首先是孩子不会隐式继承父构造函数。这是有充分理由的——否则所有对象都会继承Object 的无参数构造函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多