如何避免继承的类必须传递基类构造函数参数

时间:2014-12-03 13:30:01

标签: c#

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

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

参数是通用List<MyInterface>

C#可以实现吗?

目前我的子类构造函数看起来像这样:

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

有没有更好的方法,而不必新的列表?

4 个答案:

答案 0 :(得分:4)

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

您有两种选择。

  1. 在基类中定义无参数构造函数,然后可以避免传递参数。 (基于来自@aevitas的评论,如果您要遵循该方法,您可以将无参数构造函数定义为protected,因为这只能用于子类)
  2. 像:

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

    然后将其称为:

    public ChildClass() : base ();
    

    或只是

    public ChildClass() //Since base() would be called implicitly. 
    
    1. 另一个选项是您现在使用的选项,您可以根据您的要求传递列表的新空实例或null
    2. 您还应该重温您的设计。基类中没有无参数构造函数意味着类对象需要特定参数才能工作。解决它是code smell

答案 1 :(得分:1)

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

您将拥有两个构造函数,如下所示:

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

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

答案 2 :(得分:1)

您的基类必须

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

或者

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

答案 3 :(得分:0)

就像每个人都说你要么在基类中需要一个无参数的构造函数,要么你需要传递参数。如果子类中根本不需要参数,则可能是代码气味。

如果您只希望您的子类可以访问无参数构造函数而没有其他人可以访问protected

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