Ребята, в том и прикол что если в вашем коде нельзя заменять базовый тип подтипом, то это ваша вина и стоит вспомнить принцип LSP и переписать код.
void func(List<Shape> list) {
list.Add(new Rectangle());
list.Add(new Circle());
}
// Всё ок добавили Rectangle и Circle
// В дальнейшем коде пользуемся лишь теми методами которые доступны Shape,
// т.е. вызов list[0].getRadius() будет нарушением принципа LSP, т.к. радиус
// только у окружности или круга.
// Пользуемся методами доступными всем, например абстрактный метод draw().
// Каждая фигура может "нарисоваться". Вот и соблюдение принципа.
class Man {
public void eat() { ... }
}
class Asian extends Man {
//...
}
class European extends Man {
//...
}
// метод для всех
// Каждый человек может есть, поэтому
// Man можем заменить на Asian или European
void method(Man man) {
man.eat();
}
По поводу LSP принципа, мне кажется что вы не совсем правильно поняли.
Вы приводите пример в четвертом абзаце с Circle и Shape. Естественно что Circle нельзя заменить Shape, но этого и не было написано в принципе:
Функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа, не зная об этом.
Тут написано о возможности использовать подтип. То есть заменим
List<Shape>
на
List<Circle>
и никто не умрет, так как Circle точно имеет все методы Shape, но не наоборот. Вы же хотели сделать наоборот, что естественно нарушает этот принцип и не логично по своей природе.
Вы приводите пример в четвертом абзаце с Circle и Shape. Естественно что Circle нельзя заменить Shape, но этого и не было написано в принципе:
Тут написано о возможности использовать подтип. То есть заменим на и никто не умрет, так как
Circle
точно имеет все методыShape
, но не наоборот. Вы же хотели сделать наоборот, что естественно нарушает этот принцип и не логично по своей природе.