gpt4 book ai didi

c++ - 避免一对一关联关系中的样板代码

转载 作者:行者123 更新时间:2023-11-28 08:22:42 24 4
gpt4 key购买 nike

虽然我在用 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 中。

这只是我们必须处理的事情吗?或者有解决这些情况的方法吗?

最佳答案

嗯。针对这种特殊情况。为什么不简单地实现 Tab::getTabbable()

像这样:

const ITabbable* Tab::getTabbable() const { return m_tabbableObject; }

然后用户可以:

const ITabbable* obj = tab->getTabbable();
string title = obj->getTitle();

您不必复制所有功能。


更新:此重构通常称为 Remove Middle Man .

关于c++ - 避免一对一关联关系中的样板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com