如果我有类似的东西
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 squareor triangle。所以你不希望有 setter ,figure.Side1因为这些对于 a 没有意义。Side2Side3square
在某些时候,您必须参考squareor triangle,但仅在您所做的事情特定于子类的情况下。如果您正在实现对所有图形同样适用的行为(可能是 Draw 方法),那么它应该接受一个figure参数而不是 a squareor 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实例被传递给它,它不应该为了工作而尝试发现实际的类。