我在这个继承中的错误是什么?
What is my mistake in this inheritance?
我正在尝试创建一个 square
继承 class,它依赖于 polygon
基础 class。不幸的是,我的继承class有错误。
这是我的 polygon
class :
class Polygon
{
public int Numberofsides { get; set; }=0
public Polygon(int numberofsides)
{
Numberofsides = numberofsides;
}
}
这是我的 Square
class :
class Square : Polygon
{
public float Size { get; set; }
public Square (float size)
{
Size = size;
Numberofsides = 4;
}
}
我的Square
class有这个错误
there is no argument given that corresponds to the required formal parameter 'numberofsides' of 'Polygon.Polygon(int)'
不懂也不知道怎么解决
您的方块继承自 Polygon
,但 Polygon
只有一个构造函数(我假设)并且您每次创建 Square
时都必须能够调用它:
public Square (float size) : base(4)
{
Size = size;
//Numberofsides = 4;
}
然后你可以在 Square
中排除对 NumberOfSides
的赋值,因为已经通过 Polygon
的构造函数给你了
看起来问题是您的基础 class,Polygon 没有任何 parameter-less 构造函数。因此,您必须使用派生 class.
的构造函数中的参数调用基础 class 的构造函数
class Polygon
{
public int Numberofsides { get; set; }
public Polygon()
{
Numberofsides = 0;
}
public Polygon(int numberofsides)
{
Numberofsides = numberofsides;
}
}
class Square : Polygon
{
public float Size { get; set; }
public Square (float size)
{
Size = size;
Numberofsides = 4;
}
}
现在您的多边形 class 有一个不接受任何参数的默认构造函数。这样,当您在 Square class 中继承它时,它最初设置为 0,以便您可以在 Square class 构造函数中将其修改为 4。
"Polygon" class 中没有可以保存派生构造函数的 "float" 参数的基(或无参数)构造函数。
求解:
- 在 Polygon 中定义无参数或浮点参数化构造函数
或
对于虚拟解决方案,尝试像上面那样转换为 int
public 方形(浮动大小):基数((整数)大小)
Jonesopolis 的回答是解决错误的方法。
但是你不应该以这种方式使用继承。这是 classic 问题:"Should Rectangle inherit from Square or should Square inherit from Recangle" 答案都不是。 (例如,此处讨论:https://softwareengineering.stackexchange.com/questions/238176/why-would-square-inheriting-from-rectangle-be-problematic-if-we-override-the-set)
这里也是一样。您的 Square 不应继承自 Polygon。因为如果有人获得一个类型为 Polygon 的对象(class 实例),他可能不希望限制为 Square。它违反了 Liskov 替换原则:
Substitutability is a principle in object-oriented programming stating
that, in a computer program, if S is a subtype of T, then objects of
type T may be replaced with objects of type S (i.e. an object of type
T may be substituted with any object of a subtype S) without altering
any of the desirable properties of T (correctness, task performed,
etc.).
我正在尝试创建一个 square
继承 class,它依赖于 polygon
基础 class。不幸的是,我的继承class有错误。
这是我的 polygon
class :
class Polygon
{
public int Numberofsides { get; set; }=0
public Polygon(int numberofsides)
{
Numberofsides = numberofsides;
}
}
这是我的 Square
class :
class Square : Polygon
{
public float Size { get; set; }
public Square (float size)
{
Size = size;
Numberofsides = 4;
}
}
我的Square
class有这个错误
there is no argument given that corresponds to the required formal parameter 'numberofsides' of 'Polygon.Polygon(int)'
不懂也不知道怎么解决
您的方块继承自 Polygon
,但 Polygon
只有一个构造函数(我假设)并且您每次创建 Square
时都必须能够调用它:
public Square (float size) : base(4)
{
Size = size;
//Numberofsides = 4;
}
然后你可以在 Square
中排除对 NumberOfSides
的赋值,因为已经通过 Polygon
看起来问题是您的基础 class,Polygon 没有任何 parameter-less 构造函数。因此,您必须使用派生 class.
的构造函数中的参数调用基础 class 的构造函数class Polygon
{
public int Numberofsides { get; set; }
public Polygon()
{
Numberofsides = 0;
}
public Polygon(int numberofsides)
{
Numberofsides = numberofsides;
}
}
class Square : Polygon
{
public float Size { get; set; }
public Square (float size)
{
Size = size;
Numberofsides = 4;
}
}
现在您的多边形 class 有一个不接受任何参数的默认构造函数。这样,当您在 Square class 中继承它时,它最初设置为 0,以便您可以在 Square class 构造函数中将其修改为 4。
"Polygon" class 中没有可以保存派生构造函数的 "float" 参数的基(或无参数)构造函数。
求解:
- 在 Polygon 中定义无参数或浮点参数化构造函数
或
对于虚拟解决方案,尝试像上面那样转换为 int
public 方形(浮动大小):基数((整数)大小)
Jonesopolis 的回答是解决错误的方法。
但是你不应该以这种方式使用继承。这是 classic 问题:"Should Rectangle inherit from Square or should Square inherit from Recangle" 答案都不是。 (例如,此处讨论:https://softwareengineering.stackexchange.com/questions/238176/why-would-square-inheriting-from-rectangle-be-problematic-if-we-override-the-set)
这里也是一样。您的 Square 不应继承自 Polygon。因为如果有人获得一个类型为 Polygon 的对象(class 实例),他可能不希望限制为 Square。它违反了 Liskov 替换原则:
Substitutability is a principle in object-oriented programming stating that, in a computer program, if S is a subtype of T, then objects of type T may be replaced with objects of type S (i.e. an object of type T may be substituted with any object of a subtype S) without altering any of the desirable properties of T (correctness, task performed, etc.).