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

How do I differentiate between commonly named methods shared by two components of my class?

我有一个 class 结构,看起来像这样:

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;
}

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

我不想将参数转换为 floatint,因为调用的方法应该很明显,所以我想调用第二个 btn.SetTextOrigin(x, y).

在这种非常简单的情况下,我可以重新实现具有不同名称的方法,但我必须根据 class SpriteSetOrigin 的重载进行尽可能多的实现.

有没有比重新实现所有方法更简单的方法来使用具有不同名称的所有 SetOrigin 方法? (实现 20 个函数只是为了有一个不同的名字是很无聊的。)

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

using Text::SetOrigin as SetTextOrigin;

using SetTextOrigin = Text::SetOrigin

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

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

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

嗯,在我看来,按钮最好包含 Sprite 和 Text。它不会为您节省任何打字时间,事实上,您可能会编写更多代码,但它是一种更简洁的设计。该按钮既不是 sprite 也不是文本 - 它可以有 sprite 和文本。因此,制作 sprite 和 text 成员变量将是表达它们之间关系性质的更直接的方式。

此外,按钮的原点是否应该不同于 sprite 或文本,例如比如,按钮角的位置?

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

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

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

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.
};