Liskov Substitution Principle (LSP) в ВикипедииСовокупный класс, расширяющий базовый класс - Нарушение LSP?
Скажем, у меня есть Alien
класс с атрибутом numFingers
*. Иногда мне нужно вытащить сумму из numFingers
из базы данных, сгруппированной по другим значениям поля. В этих случаях мне не нужно манипулировать каждой записью по отдельности, но мне нужен доступ ко многим их функциям - иметь возможность получать атрибуты, выполнять на них основную логику и т. Д. Это может включать данные, суммированные из тысяч записей, поэтому имеет смысл создавать тысячи объектов Alien
, когда запрос базы данных может выполнять работу по суммированию для меня.
Я хотел бы создать класс расширения, называемый AlienAggregate
, атрибуты которого заданы из сгруппированного запроса &. Этот класс позволил бы мне вызвать любой из методов Alien
. Только разница между функциональностью двух классов, составляет GetID()
. У агрегатного класса нет идентификатора, так как его данные были получены из любого количества записей. Из-за этого вызов GetID()
на AlienAggregate
вызывает исключение.
Является ли это нарушением Принципа замены Лискова? Есть ли лучший способ обработки звонка на GetID()
? Есть ли лучший способ разработать отношения между классами Alien
и AlienAggregate
?
* Фактические имена могут быть изменены только потому, что я могу.
Я хочу, чтобы AlienAggregate расширял Alien, потому что мне нужна такая же логика в обоих классах. – keithjgrant
Я нахожу это ироничным, что вы беспокоитесь о нарушении LSP, но не беспокоитесь о том, чтобы AlienAggregate являлся подклассом Alien, когда ясно, что у них нет отношения 'is a', но' has a'. Вам нужна такая же логика в обоих классах ... так что включите ее в свой класс и дайте обоим классам доступ к ней либо через интерфейс, либо со ссылкой на экземпляр экземпляра. – Gerrat
Ну, на самом деле это не отношения 'есть' ... потому что у него нет« инопланетян », это всего лишь совокупность некоторых данных от инопланетян. Но я думаю, что вы правы в том, чтобы переместить логику в отдельный класс. Тогда «Alien» и «AlienAggregate» будут иметь общие атрибуты. – keithjgrant