2012-02-27 3 views
9

Я испробовал несколько вещей, чтобы исправить ошибку, и я просто не могу понять, что это, я бы очень признателен за любую помощь. Ошибка заключается в обоих классах треугольника и квадрата, ошибки в треугольнике: «не реализует унаследованный абстрактный элемент из 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 внутри метода. –

ответ

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() в Triangle и что вы не можете поместить ключевое слово переопределения на ComputeArea(decimal).

Это не означает, что вы не можете определить метод ComputeArea(decimal) на Triangle и Square, но вы не можете объявить его как переопределение ComputeArea() в GeometricFigure.

+0

Я понял, что это было просто, спасибо. –

4

В ваших квадратных и треугольных классах необходимо удалить параметр метода из ComputeArea(), чтобы он соответствовал сигнатуре базового класса.

Смежные вопросы