C#中的构造函数和继承问题

时间:2010-11-18 10:16:25

标签: c# inheritance constructor

我遇到以下问题:

public class A {
    public A(X, Y, Z) {
    ...
    }
}

public class B : A {
    public B(X, Y) : base(X, Y) {
        //i want to instantiate Z here and only then pass it to the base class!
    }
}

我该如何解决这个问题?有办法吗?

4 个答案:

答案 0 :(得分:13)

常见的解决方案是调用属于可以计算要传递给基础构造函数的参数值的类型的静态方法。

例如:

public B(int x, int y)
    : base(x, y, CalculateZ(x, y))
{

}

// You can make this parameterless if it does not depend on X and Y
private static int CalculateZ(int x, int y)
{
   //Calculate it here.

    int exampleZ = x + y;

    return exampleZ;
}

请注意CalculateZ不能是实例方法,因为this引用在构造函数初始值设定项中不可用。

从语言规范10.11.1构造函数初始值设定项:

  

实例构造函数初始值设定项   无法访问实例   创建。因此它是一个   编译时错误引用此   在一个参数表达式中   构造函数初始化程序,就像它一样   参数的编译时错误   表达式引用任何实例   会员通过一个简单的名字。

编辑:在说明中将'实例'更改为'静态'。

答案 1 :(得分:2)

您需要在构造函数本身被调用之前计算Z.如果它很简单,你可以使用内联表达式,否则你需要定义一个辅助函数。

使用辅助功能:

public class A {
    public A(X x, Y y, Z z) {
    ...
    }
}

public class B : A {
    private static Z calculateZ()
    {
    }

    public B(X x, Y y) : base(X, Y, calculateZ()) {

    }
}

没有辅助功能:

public B(X, Y) : base(X, Y, X+Y) {

}

答案 2 :(得分:1)

public abstract class A {
    public A(X, Y) {
    ...
    }

    public abstract Z TheVariableZ{get;set;}
}

public class B : A {
    public B(X, Y) : base(X, Y) {
        //i can only calculate Z here!
    }

    public override Z TheVariableZ{//implement it here}
}

如果你不能制作抽象,只需将属性标记为虚拟

答案 3 :(得分:1)

可能是这样的:

public abstract class A {
    public A(X, Y) {
       CalculateZ();
    }

    abstract void CalculateZ();
}

public class B : A {
    public B(X, Y) : base(X, Y) {

    }

    override void CalculateZ()
   {
      ... Calculate here.
   }
}