如何区分由我的类的两个组件共享的常用命名方法?

时间:2015-02-18 18:58:49

标签: c++ multiple-inheritance

我有一个看起来像这样的类结构:

template <typename T>
class Origin
{
public:
    void SetOrigin(T x, T y) { __x = x; __y = y; }
    void SetOrigin(vector2<T> vect) { __x = vect.x; __y = vect.y; }

private:
    T __x;
    T __y;
}
class Sprite : Origin<float>
{
public:
    using Origin::SetOrigin;
}
class Text : Origin<int>
{
public:
    using Origin::SetOrigin;
}
class Button : Sprite, Text
{
public:
    using Sprite::SetOrigin;
    using Text::SetOrigin;
}

班级Button应该有2个不同的来源,Text的来源(Button中的文字在哪里)和Button本身的来源。

我不想将论据强加给floatint,因为应该明白哪种方法被调用,所以我想打电话给第二个一个btn.SetTextOrigin(x, y)

在这个非常简单的情况下,我可以重新实现具有不同名称的方法,但是我必须在类SetOrigin中生成Sprite的重载一样多的实现。

是否有更简单的方法来使用不同名称的所有SetOrigin方法而不是重新实现所有方法? (实现20个函数只是为了有一个不同的名称是非常无聊的。)

例如,是否可以在不重写每个重载函数的情况下更改派生类中方法的名称?我想到的是:

using Text::SetOrigin as SetTextOrigin;

using SetTextOrigin = Text::SetOrigin

但我还没有找到任何东西,如果没有这样的话,你会建议在那种情况下做什么?

3 个答案:

答案 0 :(得分:0)

我相信你可以调用这样的函数

button myButton;
myButton.text::setOrigin();
myButton.sprite::setOrigin();

答案 1 :(得分:0)

嗯,在我看来,按钮更好地实现为包含Sprite和Text。它不会在输入时节省你的任何东西,事实上,你可能会写一些更多的代码,但它是一个更清洁的设计。该按钮既不是精灵也不是文本 - 它可以有精灵和文本。因此,制作精灵和文本成员变量将是表达他们关系性质的更直接的方式。

此外,如果按钮的原点与精灵或文本不同,例如比方说,按钮角落的位置?

系统上的所有按钮是否都有文字和图像? 是否可以使用原点添加其他元素到按钮。我不知道,也许两个文字元素有不同的字体?

在这种情况下,您最终可能会聚合原始元素。

答案 2 :(得分:0)

您可以实现两种不同的命名方法:

class Button : public Sprite, public Text
{
  public:
    void SetSpriteOrigin()
    {
      Sprite::SetOrigin();
    }
    void SetTextOrigin()
    {
      Text::SetOrigin();
    }
  private:
    void SetOrigin(); // Prevent users from using this ambiguous method.
};