SOLID Liskov替代原则

Omu*_*Omu 2 liskov-substitution-principle solid-principles

如果我有类似的东西

class square : figure {}

class triangle : figure {}
Run Code Online (Sandbox Code Playgroud)

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

就像从来没有这样:

var x = new square();
Run Code Online (Sandbox Code Playgroud)

dah*_*byk 6

在您的情况下,LSP意味着从中继承的所有行为figure都应该适合于squaretriangle.所以,你不希望有制定者figure.Side1,Side2以及Side3因为这些不会为一个意义square.

在某些时候,你必须引用square或者triangle,但仅限于你所做的事情是特定于子类的情况.如果你实现的行为同样适用于所有数字(也许是Draw方法),那么它应该接受一个figure参数而不是一个squaretriangle.

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

abstract class figure
{
    abstract void draw();
}

class triangle : figure
{
    void draw()
    {
        // ...
    }
}

class drawer
{
    void call_draw(figure fig)
    {
        fig.draw();
    }
}
Run Code Online (Sandbox Code Playgroud)

只要figure.draw()是虚拟的,这意味着它的实现可以(或必须)的一个子类重写,您可以执行triangledraw(),即使对象正在使用的行为figure.

  • 你让它自己画画. (6认同)
  • 而不是"绘图"(调用GDI或某些棘手的概念)考虑所有数字中存在的GetArea()或GetPerimeter().最重要的一点是Keith的第一段,他谈到Side1和Side1,这对Square来说没有意义.或者考虑一个没有边的圆.如果圆继承自图.var myCircle = new Circle(); myCircle.Side1 = xx; <====在现实世界中没有任何意义 (2认同)