SOLID Liskov替代原则

时间:2009-10-05 12:40:38

标签: solid-principles liskov-substitution-principle

如果我有类似

的话
class square : figure {}

class triangle : figure {}

这是否意味着我永远不应该使用方形和三角形类,而只是参考图?

就像从来没有这样:

var x = new square();

2 个答案:

答案 0 :(得分:6)

在您的情况下,LSP意味着从figure继承的所有行为都应该适用于squaretriangle。因此,您不希望设置figure.Side1Side2Side3的设置者,因为这些设置对square没有意义。

在某些时候,您必须引用squaretriangle,但仅限于您正在执行的操作特定于子类的情况。如果您实现的行为同样适用于所有数字(可能是Draw方法),那么它应该接受figure参数而不是squaretriangle

例如,您的类可能设置如下:

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)

您必须定义squaretriangle类并实现他们的方法 - 您必须能够构建它们,如您所示:

var x = new square();

squaretriangle的大多数(如果不是全部)其他用途都应通过基类figure.

对于 LSP ,这是指其他类中以figure为参数的其他方法:

other_method(figure fig);

这个方法应该对工作感到满意,无论实际上是否传递了squaretriangle实例,并且它不应该尝试发现实际的类以便工作。