C#。如何使用继承类的参数在基类中描述的方法?

时间:2013-11-13 10:07:09

标签: c# inheritance

让我们想象下面的类结构:

    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。安全意味着在任何情况下都不会抛出异常。

2 个答案:

答案 0 :(得分:1)

就像你创建了一个A类型的新数组,并且你的数组中的每个B实例都是A并插入该数组中。将A类型对象数组传递给方法后。

所以这就像它打算工作一样。

有关详情,请访问:Covariance and Contravariance

答案 1 :(得分:1)

是的,您的代码应该在C#中运行。 (至少,在{+ 1}}添加无参数构造函数之后,在C#4.0下我的机器上会编译它。)。

当您在A的任何子类型的数组中传递时,您编写的代码将返回A的实例。例如,如果您在传递A数组时拒绝取回B的实例,则可以使用泛型,类似于以下内容:

B