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

我已经尝试了一些方法来修复错误,我似乎无法想出这个,我会非常感谢任何帮助。 错误在Triangle和Square类中,Triangle中的错误是“不实现GeometricFigure的inheritance抽象成员”和“没有找到合适的方法来覆盖”而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; } } } 

每当你覆盖一个方法时,你必须使用与基类相同的签名覆盖(协方差和逆变的例外,但那些不适用于你的问题,所以我会在这里忽略它们)。

GeometricFigure ,您有声明

 public abstract decimal ComputeArea(); 

但是在SquareTriangle你有声明

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

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

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

将调用哪个ComputeAreaTriangle没有定义没有参数的ComputeArea ,也没有定义GeometricFigure ,所以没有有效的ComputeArea来调用。 因此,语言规范不允许这种情况,要求仅将override放在实际覆盖基类方法的方法上,并使用相同数量和类型的参数。 由于ComputeArea(decimal)不会覆盖ComputeArea() ,编译器会输出错误并告诉您必须将override关键字放在TriangleComputeArea()定义中,并且不能将override关键字放在ComputeArea(decimal)

这并不是说您无法在TriangleSquare上定义ComputeArea(decimal)方法,但您不能将其声明为覆盖GeometricFigure ComputeArea()

在square和triangle类中,需要从ComputeArea()中删除method参数,使其与基类的签名匹配。