【问题标题】:Best practice constructor with parameters in inherited classes继承类中带参数的最佳实践构造函数
【发布时间】:2015-02-06 17:20:57
【问题描述】:

我有以下简单的类设计,其中 myObject 正在为 BaseClass 导入。

public abstract class BaseClass
{
    public BaseClass(myObject parameter)
    {
        // ...
    }   
}

public class ChildClass : BaseClass
{

}

我现在的问题是,我想通过从公共 BaseClass 继承来使我的程序可扩展。所以你可以创建一个构造函数

public ChildClass() :base(new myObject()){...}

这将导致失败。是否有可能防止具有自己的构造函数的继承类?我实际上想完全避免 ChildClass 的构造函数。这可能吗?然后我可以使用工厂并提供一个 Initialize 方法。或者这是不可能的事情,我必须意识到并检查我​​的代码=

【问题讨论】:

  • 构造函数不是继承的,一个类必须有一个构造函数。如果您不定义任何构造函数,则隐含无参数构造函数。您到底想避免哪些情况?
  • 没有什么可以阻止构造函数的编写。您当然可以同意使用工厂模式并只制作私有构造函数并实现一些 IInitializable 接口或其他东西。
  • 好的,我现在他们必须有一个构造函数,但我想只允许一个带有某些参数的构造函数。像 struct 不允许无参数构造函数
  • 如果您的设计目标是支持工厂模式,为什么不考虑使用依赖注入容器(例如 Autofac、Unity 或 Ninject)来构建您的对象。正确设置,这些将允许通过容器(很像工厂)构造对象,即使类型依赖于非默认构造函数。

标签: c# inheritance


【解决方案1】:

类完全负责它们自己的构造函数。它们不是继承的,每个类必须有一个构造函数。所以不,您无法“控制”基类可以或不可以拥有的构造函数。

【讨论】:

  • 好的,谢谢。然后我猜,我会检查类中的禁止构造函数并抛出错误。
  • 什么会使构造函数“被禁止”?只是好奇你想避免什么情况。
  • @Matt 如果你不能信任你的代码的调用者,那就是出了问题。似乎您正在尝试解决一个不应该存在的问题。
  • @DavidL 可能是,你是对的。我认为我应该重新考虑解决方案的这一部分,并阅读一些关于程序可扩展性的一般最佳实践
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2017-09-13
  • 2011-04-17
  • 2011-01-02
  • 2015-08-22
  • 2010-11-14
相关资源
最近更新 更多