我有一个看起来像这样的类结构:
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
本身的来源。
我不想将论据强加给float
或int
,因为应该明白哪种方法被调用,所以我想打电话给第二个一个btn.SetTextOrigin(x, y)
。
在这个非常简单的情况下,我可以重新实现具有不同名称的方法,但是我必须在类SetOrigin
中生成Sprite
的重载一样多的实现。
是否有更简单的方法来使用不同名称的所有SetOrigin
方法而不是重新实现所有方法? (实现20个函数只是为了有一个不同的名称是非常无聊的。)
例如,是否可以在不重写每个重载函数的情况下更改派生类中方法的名称?我想到的是:
using Text::SetOrigin as SetTextOrigin;
或
using SetTextOrigin = Text::SetOrigin
但我还没有找到任何东西,如果没有这样的话,你会建议在那种情况下做什么?
答案 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.
};