2010-11-28 160 views
32

我有一个基类字符有几个派生它的类。基类有各种领域和方法。C# - 使所有派生类调用基类构造函数

我的派生类中都使用相同的基类构造函数,但是如果我没有在我的派生类中重新定义构造函数我得到的错误:

错误:类“子类”不包含一个构造函数采用这个参数数

我不想在每个派生类中重新定义构造函数,因为如果构造函数发生变化,我必须在每一个类中改变它,原谅任何误解,违背只写代码一次的想法?

+1

一个子类,你在你的构造做什么样的工作?一般来说,应该在构造函数中完成除了实例化成员之外的其他工作。 – alexn 2010-11-28 13:16:22

+0

是的只是实例化成员。基类包含所有派生类使用的5个字段,所以我只是将这些作为构造函数参数传递并设置基类字段。 – Tom 2010-11-28 13:18:18

+0

有点相关但不是重复:http://stackoverflow.com/q/12051/492 – 2013-11-08 09:18:48

回答

43

有重新声明构造函数,因为它们实际上不是被继承的。如果你认为构造函数在某些方面有点像静态方法,这是有道理的。

特别是,你不会想所有构造将自动继承 - 毕竟,这将意味着,每将有一个参数的构造函数,如object本身一样。

如果你只是想调用基类的构造函数,你不需要在构造函数的主体中编写任何代码 - 只需按照Waleed的帖子将参数传递给基类即可。

如果你的基类开始需要更多的信息,这是自然的,你应该改变所有派生类 - 实际上任何调用这些类的构造函数 - 因为他们必须提供的信息。我知道这看起来像是一种痛苦,但这只是建设者所做的一个自然结果。

55

您可以使用以下格式从从它派生的类调用基类的构造函数:

public DerivedClass() : base() { 
    // Do additional work here otherwise you can leave it empty 
} 

这将首先调用基类的构造,那么它会执行任何其他声明,如果有的话,在这个派生的构造函数中。

注意,如果基构造函数接受参数,你可以这样做:

public DerivedClass(int parameter1, string parameter2) 
    : base(parameter1, parameter2) { 
    // DerivedClass parameter types have to match base class types 
    // Do additional work here otherwise you can leave it empty 
} 

您可以找到有关在以下页面构造函数的详细信息:

http://msdn.microsoft.com/en-us/library/ms173115%28VS.80%29.aspx

1

一种替代方案可能是依赖于一个Dependency Injection容器来初始化你的对象,这样对基类的引用(可能是对基类构造函数或另一个初始化方法的调用)会“外化”到DI容器。

我不知道,如果是有意义的你的情况还是不

4

我有同样的问题,我用一个工厂方法类似这样的替换我的构造方法解决了这个问题:

A是父类。

public static T getChild<T>(int number) where T:A, new() 
{ 
    T child = new T(); 
    T._number = number; 
    return child; 

} 

您可以创建

Child b = A.getChild<Child>(2);

相关问题