繁体   English   中英

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

[英]Problem with constructors and inheritance in C#

我有以下问题:

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!
    }
}

我怎么解决这个问题? 有办法吗?

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

例如:

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构造函数初始化器:

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

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

您需要在构造函数本身被调用之前计算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) {

}
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}
}

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

可能是这样的:

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.
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM