Pull to refresh
0
0
Роман Павлюков @Cheros

Веб разработчик.

Send message
Разобрался вроде немного. Был неправ. Тогда, получается, Лискова вообще сложно соблюдать.
Ребята, в том и прикол что если в вашем коде нельзя заменять базовый тип подтипом, то это ваша вина и стоит вспомнить принцип 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, но не наоборот. Вы же хотели сделать наоборот, что естественно нарушает этот принцип и не логично по своей природе.

Information

Rating
Does not participate
Location
Харьковская обл., Украина
Date of birth
Registered
Activity