2015-10-03 4 views
1

Я новичок в дизайне OO и существует один из принципов SOLID - это принцип LISKOV Substitution.Эффективный дизайн OO

Но в моем проекте у меня есть классы с именем StartCommunicationMessage, ContinueCommunicationMessage, EndCommunicationMessage, AbortCommunicationMessage.

StartCommunicationMessage содержит: commID, qualityOfCommunication, DestAddr, origAddr EndCommunicationMessage содержит: commID, qualityOfCommunication, DestAddr ContinueCommunicationMessage содержит: commID, qualityOfCommunication, DestAddr, origAddr AbortCommunicationMessage содержит: commID, DestAddr

Так что я могу сделать сделать родителем для всех этих сообщений называется CommunicationMessage, который содержит: commID, DestAddr

Но qualityOfCom сообщение не найдено в Abort, поэтому оно будет повторяться так же, как и getter и setter во всех других классах, которые делают дублирование.

Есть ли способ уменьшить это дублирование либо путем нарушения вышеуказанного правила, либо чего-либо еще?

+0

Как всегда бывает с такими вопросами ООП, все зависит от того, как клиенты будут использовать базовый класс. Если у меня есть код, который имеет «CommunicationMessage &», как он должен взаимодействовать с этим экземпляром? Клиенты знают о таких вещах, как идентификатор или качество? Должны ли клиенты напрямую писать и читать эти значения? Хороший дизайн ООП - это, прежде всего, хороший дизайн интерфейса, а хороший дизайн интерфейса - это «как другие будут использовать это?». –

+0

@ChristianHackl: Да, у вас есть моя точка зрения, да, клиенты будут знать об этих полях, а также некоторые из них необязательны. –

+0

Клиенты не должны знать поля, но только функции-члены. Поля (aka «переменные-члены» на C++) должны быть почти всегда «частными». –

ответ

1

Если ваша цель состоит в том только, чтобы уменьшить дублирование, это не трудно:

Другой уровень наследования:

CommunicationMessage -> AbortCommunicationMessage, CommunicationMessageWithQuality 
CommunicationMessageWithQuality -> the other three classes 

или классы с несколькими родителями:

CommunicationMessage -> All 4 classes 
CommunicationMessage and Qualityclass -> Everything but AbortMessage 

Если что многие классы действительно помогите для некоторого типа сообщения,
, или если они сделают все более сложным, это другая вещь ...

+0

Лучше всего было бы использовать состав, а не наследование. –