Применяется ли принцип подстановки Лискова к подтипу, который унаследован от абстрактного класса? - PullRequest
11 голосов
/ 12 февраля 2010

Грубо говоря, принцип подстановки Лискова гласит, что производный класс может быть заменен вместо базового класса, не влияя на пользователя. В случае, когда базовый класс является абстрактным классом, что означает, что ни один пользователь не использует экземпляр базового класса, применяются ли ограничения наследования Лискова к производному классу?

Ответы [ 5 ]

6 голосов
/ 12 февраля 2010

То, что вы не можете создать экземпляр определенного класса, не означает, что вы не можете его использовать. В этом сценарии вызывающий код использует абстрактный базовый класс в качестве определения договора, в соответствии с которым он работает. В этом смысле каждый класс, производный от базового класса, должен быть взаимозаменяемым по отношению к интерфейсу, определенному базовым классом, так что да, Лисков все еще применяется. Фактически, это одна из основных причин, по которой вы хотели бы иметь абстрактный базовый класс для коллекции классов, которые имеют некоторое общее поведение - поэтому вы можете определять операции в терминах интерфейса базового класса, а не заботиться о том, какой производный класс вы на самом деле оперируете.

1 голос
/ 12 февраля 2010

Да, потому что звонящий всегда может сделать это:

BaseAbstractClass instance = new DerivedClass();
0 голосов
/ 12 февраля 2010

Да.

См. Раздел «Реальный пример» (стр. 7-8) Статья принципа подстановки Лискова дяди Боба .

0 голосов
/ 12 февраля 2010

Короче да. LSP применяется по существу все публичное наследование. Тот факт, что базовый класс является абстрактным, не меняет этого. Базовый класс определяет интерфейс, и все допустимые производные должны удовлетворять всем требованиям этого интерфейса.

0 голосов
/ 12 февраля 2010

Абстрактные классы вообще не конфликтуют с LSP. Многие люди считают использование «нового» непосредственно из клиентского кода нарушением духа LSP. Если вы оба создаете экземпляр и используете объект, вы тесно связаны с этой реализацией и не можете «заменить» ее вообще.

Подумайте о том, чтобы объект был создан с помощью фабрики или передан в качестве аргумента или путем внедрения зависимостей после того, как он был создан каким-либо репозиторием, который может быть сосредоточен на принятии решений о том, какие конкретные типы необходимы в различных обстоятельствах.

...