Не противоречит ли принцип замещения Лискова принципу открытого / закрытого? - PullRequest
3 голосов
/ 09 января 2020

Сегодня меня спросили, как принцип подстановки Лискова может противоречить принципу Open / Closed, какие-либо идеи?

Это связано с расширением родительского класса по принципу O C и невозможностью вмешаться в качестве замены принципа Лискова?

1 Ответ

2 голосов
/ 09 января 2020

Предположим, у вас есть библиотека, содержащая класс A с некоторыми функциями, и вы хотите изменить поведение (часть) этого класса.

Если вы хотите придерживаться Open / Close В принципе, вы должны создать подкласс, который наследуется от A и который ведет себя по-разному (поскольку этот принцип запрещает вам изменять класс A)

Если вы хотите придерживаться принципа Лискова, вам не разрешено создавать подкласс, который имеет другое поведение, поэтому вы должны изменить исходный класс.

Это означает, что придерживаться обоих принципов в этом случае невозможно.

Пример

Класс StorageController имеет функцию Store (), которая сохраняет ваш проект в виде XML файла. Теперь вы хотели бы изменить это так, чтобы вместо него хранился файл JSON.

Принцип открытия / закрытия гласит, что вам нужно создать подкласс 'JsonStorageController', который переопределяет этот метод для хранения json вместо xml. Однако это нарушает принцип Лискова, поскольку StorageController не может быть просто заменен JsonStorageController.

Конечно, есть другие решения, которые не нарушают эти принципы, такие как, например, переопределение базового класса и добавление дополнительный метод 'StoreTo Json', однако они могут нарушить другие принципы, например, принцип единой ответственности (наделение подкласса двумя различными обязанностями).

...