我是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;
}
}
}
答案 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#命名准则。方法应具有类似GetArea
或GetPeremiter
的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);
}