隐式调用父构造函数

时间:2012-02-28 16:22:51

标签: c#

我有一组类,其中我的base有一个构造函数,它接受一个配置对象并处理将值传递给它的属性。

abstract class A { public A(ObjType MyObj){} } 
abstract class B : A {}
class C : A {}
class D : B {}
class E : B {}

是否可以从子类隐式调用非默认的基本构造函数,或者我是否需要通过构造函数在链中显式实现签名?

abstract class A { public A(ObjType MyObj){} } 
abstract class B : A { public A(ObjType MyObj) : base(MyObj){} }
class C : A { public A(ObjType MyObj) : base(MyObj){} }
class D : B { public A(ObjType MyObj) : base(MyObj){} }
class E : B { public A(ObjType MyObj) : base(MyObj){} }

如果是这种情况,最好只在基础中实现一个方法然后让我的工厂在创建对象后立即调用该方法吗?

3 个答案:

答案 0 :(得分:4)

隐式?不,构造函数不是继承的。您的类可以显式调用它的父级构造函数。但是,如果您希望您的类具有与父类相同的构造函数签名,则必须实现它们。

例如:

public class A
{
    public A(int someNumber)
    {
    }
}

// This will not compile becase A doesn't have a default constructor and B 
// doesn't inherit A's constructors.
public class B : A
{
}

要完成这项工作,您必须显式声明您希望B拥有的构造函数,并让它们显式调用A的构造函数(除非A当然有默认构造函数)。

public class B : A
{
    public B(int someNumber) : base(someNumber)
    {
    }
}

答案 1 :(得分:1)

不可能隐式调用非默认的基本构造函数 ,你必须明确它。

答案 2 :(得分:1)

您需要在链中明确地实现它。此外,重要的是,在原始代码中,您将无法拨打new B(),因为A没有默认构造函数,B不会调用A的构造函数有一个arg。