Olá pessoal, meu nome Ă© Konstantin. Estou desenvolvendo em Java no Tinkoff.ru e adoro o SOLID. Neste artigo, formularemos o princĂpio de substituição de Lisk, mostraremos sua conexĂŁo com o princĂpio Aberto-Fechado, aprenderemos a formar adequadamente a hierarquia de herança e responderemos Ă pergunta filosĂłfica sobre se um quadrado Ă© um retângulo.

, , , .
-. , , , . . ( LSP) — , - . — , LSP, -.
:
, , -, .
:
, : o1 S o2 T, P, T, P , o2 o1, S — T.
, LSP, , , , . -, , .
LSP
, :
void drawShape(Shape shape) {
if (shape instanceof Square) {
drawSquare((Square) shape);
} else {
drawCircle((Circle) shape);
}
}
. Shape, , drawCircle, , — .
drawShape Shape. , , Shape , . Shape, -.
, LSP . , , . :
public class Rectangle {
private int width;
private int height;
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int perimeter() {
return 2 * height + 2 * width;
}
}
. , . , , , , , — Square. ?
, «» (ISA). , , ISA , , .
— . , ISA. , Square Rectangle. , , , , .
, Square height width, , side, . , ( , , ), . , Square setWidth setHeight. , :
@Override
public void setWidth(int width) {
super.setWidth(width);
super.setHeight(width);
}
@Override
public void setHeight(int height) {
super.setHeight(height);
super.setWidth(height);
}
Square . . Square. . , , , , .
, Rectangle :
public class RectangleTest {
@Test
public void perimeter() {
Rectangle rectangle = new Rectangle();
rectangle.setHeight(5);
rectangle.setWidth(7);
int result = rectangle.perimeter();
assertEquals(24, result);
}
}
, Square . Square ISA Rectangle, , Rectangle Square. , :
public class RectangleTest {
@Test
public void perimeter() {
Rectangle rectangle = initRectangle();
rectangle.setHeight(5);
rectangle.setWidth(7);
int result = rectangle.perimeter();
assertEquals(24, result);
}
protected Rectangle initRectangle() {
return new Rectangle();
}
}
public class SquareTest extends RectangleTest {
@Override
protected Rectangle initRectangle() {
return new Square();
}
}
, SquareTest.perimeter , perimeter 24, , 28. : , , ? — . , Rectangle, Square. Square Rectangle , Rectangle ( ) , Rectangle Square. Square — Rectangle, LSP .
— ?
— , , , Square — Rectangle. , Square Rectangle. , .
, ISA . , , . , .
. — , , . , , .
?
: . . , .
, , , , , . Shape Square Rectangle.
, . , . Quadrangle , , , , . .
- , , .
, , . , , , , , -.
1996 — The Liskov Substitution Principle. . , , C++. , , LSP .