Хотя я программирую на C ++, это скорее общий вопрос о дизайне.
Я заметил, что когда у меня есть объекты в однозначной ассоциации, между ними обычно существует много общих методов, что приводит к шаблонному коду, который по существу напрямую вызывает методы внутреннего класса.
В качестве примера у меня есть класс Tab
, который представляет вкладку и соответствующий ей виджет. У меня также есть класс Tabbable
, который объекты могут наследовать, чтобы их можно было отображать на вкладках. Затем Tab
может взять этот Tabbable
объект и правильно отрендерить себя. У обоих этих классов есть много похожих методов, связанных, например, с заголовком или значком.
class ITabbable {
public:
ITabbable();
virtual ~ITabbable();
virtual string getTitle() = 0;
virtual widget getContentWidget() = 0;
// etc...
}
class Tab {
public:
Tab(ITabbable* tabbableObject);
// lots of boilerplate code:
string getTitle() {
return m_tabbableObject->getTitle();
}
widget getContentWidget() {
return m_tabbableObject->getContentWidget();
}
// etc...
private:
ITabbable* m_tabbableObject; // association relationship
}
Много кода дублируется и кажется ненужным. Наследование здесь определенно не работает, потому что вы не можете поместить Tab
в Tab
.
Это просто то, с чем мы должны иметь дело? Или есть способы обойти эти ситуации?