2012-02-27 29 views
9

He intentado algunas cosas para corregir el error y parece que no puedo entender esto, agradecería mucho cualquier ayuda. El error está en las clases Triángulo y Cuadrado, los errores en Triángulo son "no implementa miembros abstractos heredados de GeometricFigure" y "no se encontró ningún método adecuado para anular" y Square tiene solo el error "no se encontró método para sobrescribir".no se encontró ningún método adecuado para anular 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 enfatizar que eliminar el parámetro como dicen las respuestas resolverá su problema * y, además, si funcionó como lo tiene actualmente, no funcionaría como esperaba. * _area no necesita ser re-declarado en su parámetro de método ya que es un campo de clase. Lo que tienes ahora es asignar a la segunda declaración de _rea dentro del alcance de la función que básicamente no hace nada, ya que no está haciendo nada para el campo de clase, sino más bien para asignar a la declaración local de _rea dentro del método. –

Respuesta

16

Cada vez que se reemplaza un método, usted tiene que reemplazar con la misma firma como en la clase base (Hay excepciones para covarianza y contravarianza, pero los que no se aplican a su pregunta, así que voy a ignorar ellos aquí).

En GeometricFigure, usted tiene la declaración

public abstract decimal ComputeArea(); 

pero en Square y Triangle usted tiene la declaración

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

Digamos que alguna otra clase contenía el siguiente código:

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

Cuál ComputeArea se llamaría? Triangle no define un ComputeArea sin argumentos, y tampoco lo hace GeometricFigure, por lo que no hay un ComputeArea válido para llamar. Como resultado, la especificación de idioma no permite este escenario al requerir que override solo se coloque en métodos que realmente anulan los métodos de la clase base, con el mismo número y tipo de argumentos. Como ComputeArea(decimal) no anula ComputeArea(), el compilador se equivoca y le indica que debe colocar la palabra clave de anulación en una definición ComputeArea() en Triangle, y que no puede poner la palabra clave de anulación en ComputeArea(decimal).

Eso no quiere decir que no se puede definir un método ComputeArea(decimal) en Triangle y Square, pero no se puede declarar como superiores al ComputeArea() en GeometricFigure.

+0

Pensé que era algo simple, gracias. –

4

En las clases cuadradas y triangulares, debe eliminar el parámetro de método de ComputeArea() para que coincida con la firma de la clase base.

Cuestiones relacionadas