用什么架构来暗示一个类中的2个行为?

时间:2012-06-08 15:36:31

标签: c++ architecture

我正在尝试创建一个同时表示两种不同行为的类。如下所示:

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?

如果鼠标和蝙蝠没有默认构造函数,如何更改架构?

非常感谢。

3 个答案:

答案 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,可在需要时选择。

此外,我会想到一个装饰器,只需在需要时添加所需的行为。即,当你需要一个超级生物时,你有一系列行为并添加一只老鼠和一只蝙蝠。当需要一个也可以吠叫的超级生物时,只需添加一种狗的行为。