我正在尝试创建一个同时表示两种不同行为的类。如下所示:
class IMouse {
public:
virtual void Walk() const = 0;
};
class TSimpleMouse : public IMouse {
public:
void Walk() const;
};
class IBat {
public:
virtual void Fly() const = 0;
};
class TSimpleBat : public IBat {
public:
void Fly() const;
};
template <class TMouse, class TBat>
class TSuperCreatureImpl {
public:
void Do() const {
Walk();
Fly();
}
};
typedef TSuperCreatureImpl<TSimpleMouse, TSimpleBat> TSimpleSuperCreature;
对于我来说,通过deafult(方法Do)进行行为很重要,因为我想制作不同的typedef。这似乎很简单。
但我也希望Fly和Walk方法有参数(例如,速度)。我应该如何修改架构以便有机会为不同的生物使用许多typedef?
如果鼠标和蝙蝠没有默认构造函数,如何更改架构?
非常感谢。
答案 0 :(得分:3)
template <class TMouse, class TBat>
class TSuperCreature : public TMouse, public TBat
{
public:
void do() const {
this->walk();
this->fly();
}
};
但我也希望Fly和Walk方法有参数(例如,速度)。我应该如何修改架构以便有机会为不同的生物使用许多typedef?非常感谢。
您可以为函数提供默认参数...
virtual void Walk(double meters_per_second = 1.1) const = 0;
修改
(来自下面的评论)想象一下,我们需要2个生物:第一个快速行走,飞得慢,第二个则相反。这意味着我们必须编写2个typedef。但我不知道如何在这里使用velovity常量。架构的哪些部分必须有参数?
一种选择是做这样的事情:
template <class TMouse, class TBat, int walk_speed, int fly_speed>
class TSuperCreature : public TMouse, public TBat
{
public:
void do() const {
this->walk(walk_speed);
this->fly(fly_speed);
}
};
如果你想使用double
,它们不被允许作为模板参数(至少在C ++ 03中不被允许),但是作为一个黑客,你可以接受一对数字并将它们分成模板,或者更准确地说,你可以提供一个政策类....
template <class TMouse, class TBat, class Speeds>
class TSuperCreature : public TMouse, public TBat
{
public:
void do() const {
this->walk(Speeds::walk_speed);
this->fly(Speeds::fly_speed);
}
};
struct Speeds__Fly_Fast__Walk_Slow // yes I know double underscores are reserved - I don't care!
{
static const double walk_speed = 0.5; // m/s
static const double fly_speed = 10;
};
答案 1 :(得分:1)
为什么不简化。
有一个移动界面,将移动方法作为参数;
enum MovementMethod { Walk, Fly, Swim };
class MoveInterface
{
public:
virtual void move(MovementMethod method) = 0;
};
// TMouse/TBat inheret from the MoveInterface
template <class TMouse, class TBat>
class TSuperCreatureImpl : public TMouse, public TBat
{
public:
virtual void move(MovementMethod /*method*/)
{
TMouse::move(Walk);
TBat::move(Fly);
}
};
答案 2 :(得分:0)
如果您一次只需要一个特殊行为,我会应用策略模式。然后你的Do-Method可以调用当前的策略,即walk或fly。 您可以拥有一个CurrentBehaviour,可在需要时选择。
此外,我会想到一个装饰器,只需在需要时添加所需的行为。即,当你需要一个超级生物时,你有一系列行为并添加一只老鼠和一只蝙蝠。当需要一个也可以吠叫的超级生物时,只需添加一种狗的行为。