0

例如,我创建了一个 Button 类。Button应该有自己的文本(颜色、大小、字体、间距等)、状态和背景。

因为文本标签即使在另一个小部件(文本标签、文本编辑等)中也很有用。我把所有需要的东西放在另一个类中(称之为Label)。

背景颜色也很有用,所以我创建了另一个类 -Color使用所有需要的方法 - 更改,比较......

现在回到 Button 类。

class Button {
    private:
        Color _bgColor;
        Label _text;

        /* another private members */

    public:
        /* Content of Button class */
};

但是如果我想改变按钮的背景颜色呢?在这种情况下,我需要编写另外两个方法 =>setColorgetColor. 事实上,我必须编写为Color类定义的所有方法。

另一种选择是将私有类定义为公共类并像button.bgColor.setColor(). button.disable但对我来说,一次又一次地打电话似乎很奇怪button.color.setColor

还有其他我不知道的选择吗?谢谢你的帮助。

4

3 回答 3

1

你是对的,当某些东西具有属性时,这些属性需要以某种方式公开,这可能导致代码膨胀。然而,与所有事物一样,一个简单的抽象层可以使事情变得更容易。

您可以为这些类型的属性提供“帮助类”并将它们用作混合。这将保持代码尽可能小,同时仍然

class HasLabel
{
public:
   void SetLabelText(const std::string& text);
   const std::string& GetLabelText() const;

private:
   Label label_;
};

class HasBackgroundColor
{
public:
   void SetBackgroundColor(const Color& color);
   const Color& GetBackgroundColor() const;

private:
   Color color_;
};

class Button : private HasBackgroundColor, private HasLabel
{
public:
   // Expose BkColor
   using HasBackgroundColor::SetLabelText;
   using HasBackgroundColor::GetLabelText;

   // Expose Label
   using HasLabel::SetLabelText;
   using HasLabel::GetLabelText;
};

您也可以使用公共继承,然后using就不需要指令了,但是这是否可以接受(如果是Button真正的 "is-a" HasLabel)是个人喜好的问题。

您还可以使用CRTP来减少具有类似 mixin 的对象的样板代码量。

于 2013-09-06T19:34:18.177 回答
1

但是如果我想改变按钮的背景颜色呢?在这种情况下,我需要编写另外两个方法 => setColor 和 getColor。事实上,我必须编写为 Color 类定义的所有方法。

为什么要这么做?只需定义一个SetBackgroundColor(Color &newColor)用于设置颜色和const Color& GetBackgroundColor() const访问它的函数!

于 2013-09-06T19:09:01.433 回答
0

但是如果我想改变按钮的背景颜色呢?在这种情况下,我需要编写另外两个方法 =>setColorgetColor. 事实上,我必须编写为Color类定义的所有方法。

不对。你只需要编写这两个方法。其他任何事情都只是通过getColor返回值发生。例如,要测试两个按钮是否具有相同的颜色,您可以编写:

if (button1.getColor() == button2.getColor())

不是

if (button1.hasSameColor(button2))

也就是说,除非您想隐藏ButtonColor类的使用作为“实现细节”。我不建议这样做。处理颜色的程序通常应该将颜色视为一种值类型,类似于纯数字、点、向量等。

于 2013-09-06T19:16:10.847 回答