2012-02-27 43 views
9

我已经尝试了几件事情要修正这个错误,我只是似乎无法弄清楚这一个,我将不胜感激任何帮助,没有合适的方法。这个错误出现在Triangle和Square类中,Triangle中的错误是“没有从GeometricFigure实现继承的抽象成员”和“没有合适的方法被覆盖”,而Square只有“找不到合适的方法覆盖”错误。找到重写C#

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; } 
    } 
} 
+1

值得强调的是,删除参数作为答案说可以解决您的问题*,而且如果它按照您目前的工作方式工作,将无法按预期工作。* _area不需要重新声明你的方法参数,因为它已经是一个类字段。你现在所拥有的是在功能范围内分配给_area的第二个声明,它基本上什么都不做,因为它对类字段没有做任何事情,而是在方法中分配给_area的本地声明。 – 2012-02-27 00:17:03

回答

16

每当你覆盖的方法,你有相同签名的基类覆盖(有对协方差和逆变例外,但这些并不适用于你的问题,所以我会忽略他们在这里)。

GeometricFigure,你必须声明

public abstract decimal ComputeArea(); 

但在SquareTriangle你必须声明

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

让我们说一些其他类包含下面的代码:

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

其中ComputeArea会被称为? Triangle没有定义,没有参数的ComputeArea,而且也不GeometricFigure,所以没有有效ComputeArea打电话。因此,语言规范通过要求override仅放置在实际覆盖基类方法的方法上,使用相同数量和类型的参数来禁止此方案。由于ComputeArea(decimal)不会覆盖ComputeArea(),编译器错误,并告诉你,你必须放在一个ComputeArea()定义override关键字在Triangle,而且你不能把override关键字上ComputeArea(decimal)

这并不是说你不能在TriangleSquare定义一个方法ComputeArea(decimal),但你不能把它声明为GeometricFigure覆盖ComputeArea()

+0

我觉得这很简单,谢谢。 – 2012-02-27 00:25:01

4

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