如何强制派生类实例化基类的构造函数

时间:2016-05-09 20:58:43

标签: c# .net

让我们说我想要一个类的使用者在初始化期间将某个对象传递给一个类,为了实现这个目的,我将它放在构造函数中。

例如:

public class Animal
{
   private string _name;
   public Animal(string name)
   {
     _name = name;
   }
} 

我无法通过Animal创建Name

好的,在我的情况下,我有一个基类Animal,我从该类定义了一堆不同的派生类,如HumanDogCat

我的问题是,我希望无法在不传递Human的情况下实例化从Name派生的任何类。 C#中没有抽象构造函数,我意识到我可以为每个类创建一个构造函数来接收Name并只调用基础构造函数但问题是我还可以创建派生类类型(Human,Dog,Cat)等等,使用无参数构造函数并在不传递Name的情况下实例化它,我想确保创建派生类的任何人都必须有一个接收Name的构造函数。我也可以做某种运行时检查并抛出一个错误,但我宁愿有编译时错误。

简而言之,我如何强制派生类实例化基类的构造函数?

1 个答案:

答案 0 :(得分:3)

你遇到的问题是派生类没有"看到"基类中的空ctor。为了让它可供儿童使用而不是直接使用基类的消费者,将空ctor声明为protected

public class Animal
{
   private string _name;
   public Animal(string name)
   {
     _name = name;
   }

   /*visible to children only empty ctor*/
   protected Animal() {}
} 

public class Dog : Animal
{}

void Main()
{
    var d = new Dog();
}

用户无法在没有字符串参数的情况下创建Animal类,但可以通过这种方式创建派生类实例。