繁体   English   中英

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

[英]C#. How can I use a method described in a base class with the arguments of inherited class?

让我们想象一下类的以下结构:

    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类中重载此方法外,我应该怎么做才能使此方法安全? 每次在每个继承的类中重载此方法都是不方便的。

PS安全意味着在任何情况下都不会抛出异常。

就像您创建一个类型为A的新数组,然后将数组中每个B实例向上转换为A并插入该数组中。 将那个A类型对象数组传递给方法之后。

所以这就是它的预期目的。

有关更多信息,请参见协方差和协方差

是的,您的代码应在C#中运行。 (至少,一旦向A添加无参数构造函数,类似的东西就会在我的计算机上的C#4.0下编译。)

书面将返回的实例代码A中的任何亚型的数组过去了A 例如,如果您坚持要在传递B数组时取回B的实例,则可以使用泛型,类似于以下内容:

class A{
    public double X;
    public double Y;

    public A(double x, double y){
        X=x; Y=y;
    }
    public A(){
        // needs to have a no-arg constructor to satisfy new() constraint on MiddlePoint
    }
    public T MiddlePoint<T>(T[] a) where T : A, new() {
        T resultPnt = new T();
        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{}

暂无
暂无

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

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