2012-02-27 23 views
9

Ho provato alcune cose per correggere l'errore e non riesco proprio a capirlo, mi farebbe molto piacere qualsiasi aiuto. L'errore si trova in entrambe le classi Triangolo e Quadrato, gli errori in Triangolo sono "non implementa il membro astratto ereditato da GeometricFigure" e "nessun metodo adatto trovato per sovrascrivere" e Square ha solo l'errore "Nessun metodo adatto trovato per sovrascrivere".non è stato trovato alcun metodo adatto per ignorare 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

Vale la pena sottolineare che rimuovendo il parametro come le risposte dicono risolverà il problema, * e inoltre se ha funzionato come lo hai attualmente non funzionerebbe come volevi. * _area non ha bisogno di essere dichiarata nuovamente il tuo parametro di metodo in quanto è già un campo di classe. Quello che hai adesso sta assegnando alla seconda dichiarazione di _area nell'ambito della funzione che fondamentalmente non fa nulla poiché non sta facendo nulla al campo della classe, ma piuttosto all'assegnazione alla dichiarazione locale di _area all'interno del metodo. –

risposta

16

Ogni volta che l'override un metodo, è necessario sovrascrivere con la stessa firma come nella classe base (ci sono eccezioni per covarianza e controvarianza, ma quelli non si applicano alla tua domanda, quindi mi ignorare loro qui).

In GeometricFigure, avete la dichiarazione

public abstract decimal ComputeArea(); 

ma in Square e Triangle avete la dichiarazione di

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

Diciamo che qualche altra classe conteneva il seguente codice:

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

Quale ComputeArea verrebbe chiamato? Triangle non definisce uno ComputeArea senza argomenti, né lo è GeometricFigure, quindi non è necessario chiamare ComputeArea valido. Di conseguenza, la specifica della lingua non consente questo scenario richiedendo che lo override sia posto solo su metodi che sovrascrivono effettivamente i metodi della classe base, con lo stesso numero e tipo di argomenti. Poiché ComputeArea() non sostituisce lo ComputeArea(), il compilatore genera errori e ti dice che è necessario posizionare la parola chiave override su una definizione ComputeArea() in Triangle e che non è possibile inserire la parola chiave override su ComputeArea(decimal).

Questo non vuol dire che non si può definire un metodo ComputeArea(decimal) su Triangle e Square, ma non è possibile dichiarare come l'override ComputeArea() in GeometricFigure.

+0

Ho pensato che fosse qualcosa di semplice, grazie. –

4

Nelle classi quadrate e triangolari, è necessario rimuovere il parametro metodo da ComputeArea() in modo che corrisponda alla firma della classe base.

Problemi correlati