2012-02-27 21 views
9

私はエラーを修正するためにいくつかのことを試みましたが、私はこれを理解できないようです。エラーはTriangleクラスとSquareクラスの両方であり、Triangleのエラーは "GeometricFigureから継承した抽象メンバを実装していません"と "オーバーライドに適したメソッドが見つかりませんでした"で、Squareは "適切なメソッドが見つかりませんでした"適切なメソッドがCのオーバーライドに見つかりませんでした。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の2番目の宣言に代入していますが、代わりにメソッド内の_areaのローカル宣言に代入しています。 –

答えて

16

あなたがメソッドをオーバーライドするたび、あなたは基底クラスと同じ署名で上書きする必要がある(そこ共変性と反変性の例外がありますが、それらは、あなたの質問には適用されませんので、私は無視します彼らはここにいる)。 GeometricFigure

、あなたは宣言

public abstract decimal ComputeArea(); 

が、Square内を持っているとTriangleあなたは

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)を定義することはできませんが、あなたはGeometricFigureComputeArea()をオーバーライドとしてそれを宣言することができないと言うことはありません。

+0

私はそれが何か簡単だと思った、ありがとう。 –

4

正方形と三角形のクラスでは、基本クラスのシグネチャと一致するように、ComputeArea()からメソッドパラメータを削除する必要があります。

関連する問題