2

C++ で Decorator パターンを使用し、装飾されたオブジェクトの署名/ID に依存できるようにしたいと考えています。C++でそれを行うことは可能ですか?

つまり、コンポーネントを装飾したいと思います。

class Component {
  public:
      Component();
      virtual void doSomething();
}

デコレータで:

class Decorator : public Component {
  public:
      Decorator(Component*);
      virtual void doSomething();
  private:    
      Component* _component;
}

私がするとき:

Component foo;
Decorator(&foo) bar;
std::cout << typeid(bar).name() << std::endl;

「Decorator」の代わりに「Component」を出力します。

(これは実際には、decorator モジュールを使用して Python で行うのは非常に簡単ですが、私は現在 C++ を学んでおり、この質問に対する答えをどこから探し始めればよいかさえわかりません。)

これは、Component クラスを拡張したいが、透過的な方法で (拡張されていないかのように) 使用できる場合に便利です。

class ExtendDecorator : public Decorator {
  public:
      ExtendDecorator(Component*);
      virtual void doSomething();    

  private:
      void doSomethingMore();
}

void ExtendDecorator::doSomething() {
    Decorator::doSomething();
    doSomethingMore();
}
4

1 に答える 1

4

C++ では演算子 typeid のオーバーロードが許可されていないため、私が提案できる唯一の解決策は、装飾された型の type_info を返す仮想メソッドを追加することです。

class Component {
  public:
      Component();
      virtual void doSomething();
      virtual const std::type_info& decorated_type() const 
      { return typeid(*this); } 
};

class Decorator : public Component {
  public:
      Decorator(Component*);
      virtual void doSomething();
      virtual const std::type_info& decorated_type() const 
      { return typeid(*_component); } 
  private:    
      Component* _component;
};

多分より良いバージョンDecorator::decorated_type() const:

virtual const std::type_info& decorated_type() const 
{ return _component->decorated_type(); } 
于 2012-06-24T20:48:04.033 に答える