找不到覆盖c#的合适方法

本文关键字:方法 覆盖 找不到 | 更新日期: 2023-09-27 18:25:48

我已经尝试了一些方法来修复这个错误,但我似乎无法解决这个问题,我将非常感谢任何帮助。错误在Triangle和Square类中,Triangle中的错误是"没有实现从GeometricFigure继承的抽象成员"answers"没有找到合适的方法来覆盖",Square只有"没有找到适合的方法来替代"的错误。

namespace ShapesDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Rectangle rec = new Rectangle(8,10);
            Square squ = new Square(11, 12);
            Triangle tri = new Triangle(10, 20);
            Console.WriteLine("Computed area is {0}" + "'n'n" + "Computed Triangle is: {1}"         + "'n", squ.ComputeArea(rec.Area), tri.ComputeArea(rec.Area));
        }
    }
    abstract class GeometricFigure
    {
        public decimal _height, _width, _area;

        public decimal Height
        {
            get { return _height; }
            set { _height = value; }
        }
        public decimal Width
        {
            get { return _width; }
            set { _width = value; }
        }
        public decimal Area
        {
            get { return _area; }
        }
        public abstract decimal ComputeArea();
    }
    class Rectangle : GeometricFigure
    {
        private decimal height, width;
        public Rectangle(decimal sideA, decimal sideB)
        {
            this.height = sideA;
            this.width = sideB;
        }
        public Rectangle()
        {
        }
        public override decimal ComputeArea()
        {
            Console.WriteLine("The Area is" + _width.ToString(), _height.ToString());
            return width * height;
        }
    }
    class Square : Rectangle
    {
        public Square(decimal sideA, decimal sideB)
        {
            this._width = sideA;
            this._height = sideB;
            if (sideA != sideB)
                this._height = this._width;
        }
        public Square(decimal xy)
        {
            this._width = xy;
            this._height = this._width;
        }
        public override decimal ComputeArea(decimal _area)
        { return _area = this._width * this._height; }
    }
    class Triangle : GeometricFigure
    {
        public Triangle(int x, int y)
        {
            this.Width = x;
            this.Height = y;
        }
        public override decimal ComputeArea(decimal _area)
        { return _area = (this.Width * this.Height) / 2; }
    }
}

找不到覆盖c#的合适方法

无论何时重写一个方法,都必须使用与基类中相同的签名进行重写(协方差和逆变都有例外,但这些不适用于您的问题,所以我在这里忽略它们)。

GeometricFigure中,您有声明

public abstract decimal ComputeArea();

但是在SquareTriangle中有声明

public override decimal ComputeArea(decimal _area)
{
    // ...
}

假设其他类包含以下代码:

GeometricFigure fig = new Triangle(10, 10);
decimal area = fig.ComputeArea();

将调用哪个ComputeAreaTriangle没有定义一个没有参数的ComputeAreaGeometricFigure也没有,所以没有有效的ComputeArea可以调用。因此,语言规范要求override只能放在具有相同数量和类型参数的实际重写基类方法的方法上,从而不允许出现这种情况。由于ComputeArea(decimal)不会覆盖ComputeArea(),因此编译器会出错,并告诉您必须将覆盖关键字放在Triangle中的ComputeArea()定义上,并且不能将覆盖关键字放置在ComputeArea(decimal)上。

这并不是说不能在TriangleSquare上定义方法ComputeArea(decimal),但不能将其声明为GeometricFigure中的重写ComputeArea()

在正方形和三角形类中,需要从ComputeArea()中删除方法参数,以便它与基类的签名匹配。