2

如果我有类似的东西

class square : figure {}

class triangle : figure {}

这是否意味着我永远不应该使用 square 和 triangle 类而只参考图形?

就像从不这样做:

var x = new square();
4

2 回答 2

6

在您的情况下,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.

于 2009-10-05T13:07:25.160 回答
2

您必须定义squaretriangle类并实现它们的方法 - 并且您必须能够构造它们,正如您所指出的:

var x = new square();

大多数,如果不是所有其他用途,square并且triangle应该通过基类figure.

至于LSP,这是指其他类中的其他方法,这些方法figure作为参数:

other_method(figure fig);

这个方法应该对工作感到满意,无论实际上是一个square还是一个triangle实例被传递给它,它不应该为了工作而尝试发现实际的类。

于 2009-10-07T09:31:06.810 回答