Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

no suitable method found to override c#

Tags:

c#

I have tried a few things to fix the error and I just can't seem to figure this one out, I would greatly appreciate any help. The error is in both the Triangle and Square classes, the errors in Triangle are "does not implement inherited abstract member from GeometricFigure" and "no suitable method found to override" and Square has just the "no suitable method found to override" error.

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; }
    }
}
like image 390
John Joseph Avatar asked Feb 27 '12 00:02

John Joseph


2 Answers

Whenever you override a method, you have to override with the same signature as in the base class (there are exceptions for covariance and contravariance, but those don't apply to your question, so I'll ignore them here).

In GeometricFigure, you have the declaration

public abstract decimal ComputeArea();

but in Square and Triangle you have the declaration

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

Let's say that some other class contained the following code:

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

Which ComputeArea would be called? Triangle doesn't define a ComputeArea with no arguments, and neither does GeometricFigure, so there is no valid ComputeArea to call. As a result, the language spec disallows this scenario by requiring that override only be placed on methods that actually override methods of the base class, with the same number and type of arguments. Since ComputeArea(decimal) doesn't override ComputeArea(), the compiler errors out and tells you that you must place the override keyword on a ComputeArea() definition in Triangle, and that you can't put the override keyword on ComputeArea(decimal).

That's not to say that you can't define a method ComputeArea(decimal) on Triangle and Square, but you can't declare it as overriding ComputeArea() in GeometricFigure.

like image 137
Adam Mihalcin Avatar answered Oct 07 '22 21:10

Adam Mihalcin


In your square and triangle classes, you need to remove the method parameter from ComputeArea() so that it matches the signature of the base class.

like image 28
Erik Dietrich Avatar answered Oct 07 '22 21:10

Erik Dietrich