Хотя я программирую на 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
.
Это просто то, с чем нам приходится иметь дело?Или есть способы обойти эти ситуации?