如果我有类似的东西
class square : figure {}
class triangle : figure {}
这是否意味着我永远不应该使用 square 和 triangle 类而只参考图形?
就像从不这样做:
var x = new square();
如果我有类似的东西
class square : figure {}
class triangle : figure {}
这是否意味着我永远不应该使用 square 和 triangle 类而只参考图形?
就像从不这样做:
var x = new square();
在您的情况下,LSP 意味着继承自的所有行为figure
都应该适用于 a square
or triangle
。所以你不希望有 setter ,figure.Side1
因为这些对于 a 没有意义。Side2
Side3
square
在某些时候,您必须参考square
or triangle
,但仅在您所做的事情特定于子类的情况下。如果您正在实现对所有图形同样适用的行为(可能是 Draw 方法),那么它应该接受一个figure
参数而不是 a square
or triangle
。
例如,您的类可能设置如下:
abstract class figure
{
abstract void draw();
}
class triangle : figure
{
void draw()
{
// ...
}
}
class drawer
{
void call_draw(figure fig)
{
fig.draw();
}
}
只要figure.draw()
是虚拟的,意味着它的实现可以(或必须)被子类覆盖,triangle
即使draw()
对象被用作figure
.
您必须定义square
和triangle
类并实现它们的方法 - 并且您必须能够构造它们,正如您所指出的:
var x = new square();
大多数,如果不是所有其他用途,square
并且triangle
应该通过基类figure.
至于LSP,这是指其他类中的其他方法,这些方法figure
作为参数:
other_method(figure fig);
这个方法应该对工作感到满意,无论实际上是一个square
还是一个triangle
实例被传递给它,它不应该为了工作而尝试发现实际的类。