让我们想象下面的类结构:
class A{
public double X;
public double Y;
public A(double x, double y){
X=x; Y=y;
};
public A MiddlePoint(A[] a){
A resultPnt = new A(0,0);
for (int i = 0; i < a.Length; i++){
resultPnt.X += a[i].X;
resultPnt.Y += a[i].Y;
}
resultPnt.X = (this.X + resultPnt.X)/(a.Length + 1);
resultPnt.Y = (this.Y + resultPnt.Y)/(a.Length + 1);
}
}
class B:A{}
使用这样的方法是否安全:
B b = new B();
B[] arr = new B[2];
b.MiddlePoint(arr);
? 如果没有,除了在B类中重载之外,我应该怎么做才能使这个方法调用安全?每次在每个继承的类中重载此方法都不方便。
P.S。安全意味着在任何情况下都不会抛出异常。
答案 0 :(得分:1)
就像你创建了一个A
类型的新数组,并且你的数组中的每个B
实例都是A
并插入该数组中。将A
类型对象数组传递给方法后。
所以这就像它打算工作一样。
有关详情,请访问:Covariance and Contravariance
答案 1 :(得分:1)
是的,您的代码应该在C#中运行。 (至少,在{+ 1}}添加无参数构造函数之后,在C#4.0下我的机器上会编译它。)。
当您在A
的任何子类型的数组中传递时,您编写的代码将返回A
的实例。例如,如果您在传递A
数组时拒绝取回B
的实例,则可以使用泛型,类似于以下内容:
B