2

デザインに問題があります。

/// Generic class. Not owned by myself
class Node
{
    add(Node* v) { /* do somthing */ }
 };

/// interface writtern by myself
class ImyNode
{
    add(ImyNode* v) = 0;

    /// More functions
};

/// Implement ImyNode, use Node for implementation of SOME functions. 
class myNode:
    public ImyNode,
    public Node
{
    add(ImyNode* v) { Node::add(v); } // Error: ImyNode is not a type of Node
};

エラーはもちろん正しいです。そこに驚くことはありません。しかし、解決策が必要です。このコンパイル エラーを解決する方法。

4 つの提案があります。

  1. 関数 myNode::add() で reinterpret_cast 演算子を使用する
  2. インターフェイス INode を作成し、ImyNode がこの INode を拡張できるようにします
  3. ImyNode::add(ImyNode* v) を ImyNode::add(myNode* v) に変更します
  4. ImyNode に Node を拡張させる

4つの提案はすべて私には受け入れられません。なんで?

  1. うまくいきません。醜い。悪いアイデア
  2. ノードを所有していない場合はどうなりますか? クラス階層がそれよりも複雑な場合はどうなりますか?
  3. インターフェイスは、その派生クラスについて何も認識してはなりません
  4. インターフェイスが非インターフェイス クラスを拡張するのは好きではありません。この道を進んだとしても、ImyNode CTOR なしで Node CTOR を呼び出すにはどうすればよいでしょうか。

誰かがより良いデザインやエレガントなソリューションを持っている場合、または私の提案の1つが良いと私に納得させることができる場合は、そうしてください.

ありがとう。

4

2 に答える 2

1

設計そのもので、ある種のビジター パターンを使用する必要があります。つまり、すべての派生ノードをインターフェイスに配置します。他の解決策は、動的キャストおよび/または ImyNode から Node へのアダプターを使用することです。そのように:

  class myNode;
  class someOtherNode; // if any.  
  class ImyNode {
  public:
     virtual void add(myNode* node) = 0;
     virtual void add(someOtherNode* node) = 0;
   };

ここでは ImyNode を ImyNode に追加することはできないので、自分が何をしているのかを知っておく必要があります。myNode 以外の特殊化がない場合は、インターフェースを削除してください。役に立たないことが判明したためです。

于 2013-04-15T07:49:31.143 に答える