В вашем случае LSP будет означать, что все поведение, унаследованное от figure
, должно соответствовать square
или triangle
. Таким образом, вы не хотели бы иметь сеттеры для figure.Side1
, Side2
и Side3
, потому что они не имеют смысла для square
.
В какой-то момент вам придется ссылаться на square
или triangle
, но только в тех случаях, когда то, что вы делаете, относится к подклассу. Если вы реализуете поведение, которое будет одинаково хорошо применяться для всех фигур (возможно, метод Draw), тогда он должен принять параметр figure
вместо square
или triangle
.
Например, ваши классы могут быть настроены следующим образом:
abstract class figure
{
abstract void draw();
}
class triangle : figure
{
void draw()
{
// ...
}
}
class drawer
{
void call_draw(figure fig)
{
fig.draw();
}
}
Пока figure.draw()
является виртуальным, то есть его реализация может (или должна) быть переопределена подклассом, вы можете выполнить triangle
поведение *1021*, даже если объект используется как figure
.