2011-01-21 3 views
0

Liskov Substitution Principle (LSP) в ВикипедииСовокупный класс, расширяющий базовый класс - Нарушение LSP?


Скажем, у меня есть Alien класс с атрибутом numFingers *. Иногда мне нужно вытащить сумму из numFingers из базы данных, сгруппированной по другим значениям поля. В этих случаях мне не нужно манипулировать каждой записью по отдельности, но мне нужен доступ ко многим их функциям - иметь возможность получать атрибуты, выполнять на них основную логику и т. Д. Это может включать данные, суммированные из тысяч записей, поэтому имеет смысл создавать тысячи объектов Alien, когда запрос базы данных может выполнять работу по суммированию для меня.

Я хотел бы создать класс расширения, называемый AlienAggregate, атрибуты которого заданы из сгруппированного запроса &. Этот класс позволил бы мне вызвать любой из методов Alien. Только разница между функциональностью двух классов, составляет GetID(). У агрегатного класса нет идентификатора, так как его данные были получены из любого количества записей. Из-за этого вызов GetID() на AlienAggregate вызывает исключение.

Является ли это нарушением Принципа замены Лискова? Есть ли лучший способ обработки звонка на GetID()? Есть ли лучший способ разработать отношения между классами Alien и AlienAggregate?

* Фактические имена могут быть изменены только потому, что я могу.

ответ

1

Я не думаю, что вы нарушая LSP поскольку принцип применяется только тогда, когда Alien является подтипом AlienAggregate (или наоборот). Здесь нет отношения is a (более агрегирования Alien, как вы их правильно назвали).

Вместо этого это звучит как Alien, так и AlienAggregate, вероятно, реализует интерфейс . Класс Alien имеет дополнительный метод, GetID().

... просто остерегайтесь гнусного метода BeginInvasion на AlienAggregate.

+0

Я хочу, чтобы AlienAggregate расширял Alien, потому что мне нужна такая же логика в обоих классах. – keithjgrant

+0

Я нахожу это ироничным, что вы беспокоитесь о нарушении LSP, но не беспокоитесь о том, чтобы AlienAggregate являлся подклассом Alien, когда ясно, что у них нет отношения 'is a', но' has a'. Вам нужна такая же логика в обоих классах ... так что включите ее в свой класс и дайте обоим классам доступ к ней либо через интерфейс, либо со ссылкой на экземпляр экземпляра. – Gerrat

+0

Ну, на самом деле это не отношения 'есть' ... потому что у него нет« инопланетян », это всего лишь совокупность некоторых данных от инопланетян. Но я думаю, что вы правы в том, чтобы переместить логику в отдельный класс. Тогда «Alien» и «AlienAggregate» будут иметь общие атрибуты. – keithjgrant

Смежные вопросы