如果我有类似
的话class square : figure {}
class triangle : figure {}
这是否意味着我永远不应该使用方形和三角形类,而只是参考图?
就像从来没有这样:
var x = new square();
答案 0 :(得分:6)
在您的情况下,LSP意味着从figure
继承的所有行为都应该适用于square
或triangle
。因此,您不希望设置figure.Side1
,Side2
和Side3
的设置者,因为这些设置对square
没有意义。
在某些时候,您必须引用square
或triangle
,但仅限于您正在执行的操作特定于子类的情况。如果您实现的行为同样适用于所有数字(可能是Draw方法),那么它应该接受figure
参数而不是square
或triangle
。
例如,您的类可能设置如下:
abstract class figure
{
abstract void draw();
}
class triangle : figure
{
void draw()
{
// ...
}
}
class drawer
{
void call_draw(figure fig)
{
fig.draw();
}
}
只要figure.draw()
是虚拟的,意味着它的实现可以(或必须)被子类覆盖,即使对象正在执行,您也可以执行triangle
的{{1}}行为用作draw()
。
答案 1 :(得分:2)
您必须定义square
和triangle
类并实现他们的方法 - 您必须能够构建它们,如您所示:
var x = new square();
square
和triangle
的大多数(如果不是全部)其他用途都应通过基类figure.
对于 LSP ,这是指其他类中以figure
为参数的其他方法:
other_method(figure fig);
这个方法应该对工作感到满意,无论实际上是否传递了square
或triangle
实例,并且它不应该尝试发现实际的类以便工作。