【问题标题】:How can I avoid that the inherited class have to pass the base class constructor parameter如何避免继承类必须传递基类构造函数参数
【发布时间】:2014-12-03 22:20:53
【问题描述】:

我有一个基类和一个继承子类。

基类构造函数接受我不想从子构造函数传递的参数。

参数是通用的List<MyInterface>

用 C# 可以吗?

目前我的子类构造函数如下所示:

public ChildClass() : base (new List<MyInterface>());

有没有更好的方法而无需更新列表?

【问题讨论】:

  • 要么在基类中定义无参数构造函数,要么将 null/new List 传递给基类构造函数。
  • 引入一个强制性参数然后解决它的必要性可能暗示设计错误。
  • 但是 null 参数只有在基类逻辑允许的情况下才有效
  • 如果您显示更多的基类和子类,可能会提出更好的解决方案。例如,也许您应该引入一个接口,您的基类和子类都实现了该接口 - 然后您的子类将不会从基类继承。

标签: c#


【解决方案1】:

如果您的基类构造函数需要一个参数,您必须从 Child 类传递该参数。

你有两个选择。

  1. 在基类中定义一个无参数的构造函数,然后你就可以避免传递你的参数。 (根据@aevitas 的评论,如果您打算采用这种方法,您可以将无参数构造函数定义为protected,因为它只对子类可用)

喜欢:

public class BaseClass
{
   public BaseClass() // or protected
   {
     //does nothing
   }
}

然后这样称呼它:

public ChildClass() : base ();

或者只是

public ChildClass() //Since base() would be called implicitly. 
  1. 另一个选项是您现在使用的,您可以根据您的要求传递列表的新空实例或null。

您还应该重新审视您的设计。基类中没有无参数构造函数意味着类对象需要该特定参数才能工作。解决它是code smell。

【讨论】:

  • 如果您打算这样做,可能值得将无参数构造函数声明为protected,以确保特定构造函数仅由派生类型使用。
  • @aevitas,这是一个很好的建议,将其添加到答案中
【解决方案2】:

你可以在你的基类上添加一个无参数的构造函数来为你创建新的 List 吗?除此之外,不,你必须这样做。

你会有两个构造函数,像这样:

public BaseClass(List<MyInterface> newList)
{
    //blah blah blah
}

public BaseClass()
{
    var myList = new List<MyInterface>();
}

【讨论】:

  • 另外,如果这不会中断程序,您可以将 null 作为参数传递给基类构造函数
【解决方案3】:

你的基类必须要么

A) define a parameterless constructor so that you can invoke base() 

或者

B) be ok with accepting a null value for the List<MyInterface> param

【讨论】:

    【解决方案4】:

    就像大家说的那样,你要么需要基类中的无参数构造函数,要么需要传递参数。如果子类中根本不需要该参数,则可能是代码异味。

    如果您只希望您的子类能够访问无参数构造函数而没有其他构造函数,则可以将其设为 protected。

    public class BaseClass {
        protected BaseClass() : this(new List<MyInterface>()) {
        }
        public BaseClass(List<MyInterface> newList)
        {
            //blah blah blah
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 2015-12-02
      相关资源
      最近更新 更多