继承错误S57036没有给出参数

时间:2017-07-27 03:32:50

标签: c#

我是C#的新手并且正在努力完成教程打印输出。我的目的是从Rectangle类继承属性。但是我收到一个我无法解决的错误。任何提示赞赏谢谢 错误C57036没有给出符合所需形式参数的参数' a' ' Rectangle.Rectangle(double,double)'

{

{
    //private static void Main(string[] args)
    {
        Rectangle myRectangle = new Rectangle(23.5, 8.6);
        Console.WriteLine(myRectangle.getArea().ToString());
        Console.WriteLine(myRectangle.getParimeter().ToString());
        Square mySquare = new Square(15);
        Console.WriteLine(mySquare.getArea().ToString());
        Console.WriteLine(mySquare.getParimeter().ToString());
        Console.ReadLine();
    }
}

class Rectangle
{
    private double length; 
    private double width; 

    public Rectangle(double a, double b)
    {
        length = a;
        width = b;
    }

    public double getArea()
    {
        return this.length * this.width;
    }
    public double getParimeter()
    {
        return 2 * (this.length + this.width);
    }
}
 class Square : Rectangle
{ 
    public Square(double a)        
    {
        length = a;
    }
}

}

1 个答案:

答案 0 :(得分:1)

Rectangle没有没有参数的公共构造函数,因此您需要声明构造函数并使用参数调用合适的基础构造函数:

class Square : Rectangle
{ 
    public Square(double a) : base(a, a)     
    {

    }
}

这也解决了访问代码中私有财产的问题 这应该可以解决编译错误。

但是,在您的情况下,如果您使您的课程变得可变,您似乎可以直接进入最受欢迎的Liskov Substitution Principle违规案例。
简而言之,在可变性的情况下,即使在现实世界中听起来合乎逻辑,您也无法从Square继承Rectangle。无法实现矩形的宽度或高度变化,以便在所有情况下都能正常运行。

在这里阅读更多相关信息:

Is deriving square from rectangle a violation of Liskov's Substitution Principle?

P.S。请遵循C#命名准则。方法应具有类似GetAreaGetPeremiter的UpperCamelCase名称。当您看到名称以Get开头的方法时,您可能希望它成为属性:

class Rectangle
{
    private double _length; 
    private double _width; 

    public Rectangle(double a, double b)
    {
        _length = a;
        _width = b;
    }

    public double Area => this.length * this.width;

    public double Perimeter => 2 * (this.length + this.width);
}