Говоря свободно, принцип замены Лискова утверждает, что производный класс может быть заменен вместо базового класса, не затрагивая пользователя. В случае, когда базовый класс является абстрактным классом, а это означает, что пользователь не использует экземпляр базового класса, применяются ли ограничения наследования Лискова к производному классу?
Принцип замещения Лискова применим к подтипу, унаследованному от абстрактного класса?
Ответ 1
Просто потому, что вы не можете создать экземпляр определенного класса, это не значит, что вы не можете его использовать. В этом случае вызывающий код использует абстрактный базовый класс в качестве определения контракта, в котором он работает. В этом смысле каждый класс, который вытекает из базового класса, должен быть взаимозаменяемым по отношению к интерфейсу, определенному базовым классом, поэтому да Лисков все еще применяется. На самом деле, это одна из основных причин, почему вы хотели бы иметь абстрактный базовый класс для коллекции классов, которые имеют некоторое общее поведение - поэтому вы можете определять операции с точки зрения интерфейса базового класса и не заботиться о том, какой производный класс вы на самом деле работаете.
Ответ 2
Да, поскольку вызывающий может всегда это делать:
BaseAbstractClass instance = new DerivedClass();
Ответ 3
Абстрактные классы вообще не конфликтуют с LSP. Многие считают, что использование "нового" непосредственно из клиентского кода является нарушением духа LSP. Если вы оба создаете экземпляр и используете объект, вы тесно привязаны к этой реализации, и вы не можете "заменить" его вообще.
Рассмотрите возможность создания объекта с помощью factory или переданного в качестве аргумента или путем инъекции зависимостей после создания каким-то репозиторием, который может быть сфокусирован на принятии решений о том, какие конкретные типы необходимы в различных обстоятельствах.
Ответ 4
Короче говоря, да. LSP применяется к практически всему наследуемому наследованию. Тот факт, что базовый класс является абстрактным, не меняет этого. Базовый класс определяет интерфейс, и все законные производные должны удовлетворять всем требованиям этого интерфейса.
Ответ 5
Да.
См. раздел "Реальный пример" (стр. 7-8) Дядя Боб Статья о принципе замены Лискова.