2012-02-27 8 views
9

J'ai essayé quelques petites choses pour corriger l'erreur et je n'arrive pas à comprendre cela, j'apprécierais grandement toute aide. L'erreur est dans les classes Triangle et Square, les erreurs dans Triangle sont "n'implémente pas le membre abstrait hérité de GeometricFigure" et "aucune méthode appropriée trouvée pour redéfinir" et Square n'a que l'erreur "pas de méthode appropriée pour remplacer".aucune méthode appropriée trouvée pour remplacer 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

Il vaut la peine de souligner que la suppression du paramètre comme le disent les réponses résoudra votre problème, * et de plus, si cela fonctionne comme vous l'avez actuellement, cela ne fonctionnera pas comme prévu. * _area n'a pas besoin d'être re-déclaré votre paramètre de méthode car il est déjà un champ de classe. Ce que vous avez en ce moment est d'assigner à la seconde déclaration de _area dans la portée de la fonction qui ne fait rien puisqu'elle ne fait rien dans le champ de classe, mais à la déclaration de _area dans la méthode. –

Répondre

16

Chaque fois que vous remplacez une méthode, vous devez remplacer avec la même signature que dans la classe de base (il y a des exceptions pour covariance et contravariance, mais ceux qui ne s'appliquent pas à votre question, donc je vais ignorer les ici).

En GeometricFigure, vous avez la déclaration

public abstract decimal ComputeArea(); 

mais Square et Triangle vous avez la déclaration

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

Disons que d'une autre classe contenait le code suivant:

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

Qui ComputeArea serait appelé? Triangle ne définit pas un ComputeArea sans arguments, ni GeometricFigure, donc il n'y a pas ComputeArea valide pour appeler. Par conséquent, la spécification de langage interdit ce scénario en exigeant que override soit placé uniquement sur les méthodes qui surchargent réellement les méthodes de la classe de base, avec le même nombre et le même type d'arguments. Puisque ComputeArea(decimal) ne remplace pas ComputeArea(), le compilateur commet une erreur et vous indique que vous devez placer le mot-clé override sur une définition ComputeArea() dans Triangle, et que vous ne pouvez pas mettre le mot-clé override sur ComputeArea(decimal).

Cela ne veut pas dire que vous ne pouvez pas définir une méthode ComputeArea(decimal) sur Triangle et Square, mais vous ne pouvez pas déclarer comme primant ComputeArea() dans GeometricFigure.

+0

Je pensais que c'était quelque chose de simple, merci. –

4

Dans vos classes carrées et triangulaires, vous devez supprimer le paramètre method de ComputeArea() afin qu'il corresponde à la signature de la classe de base.

Questions connexes