2016-04-11 11 views
0

の間、私はこのように、Visitorパターンを開発しています:もちろんConfigAConfigBAbstractConfigを拡張する場合は、多型は、親と子のクラス

@Component 
public class ConcreteVisitor extends AbstractVisitor { 
    public void visit(ConfigA config) { 
     // Do something 
    } 
    public void visit(ConfigB config) { 
     // Do something 
    } 
} 

によって継承され

public abstract class AbstractVisitor { 
    public void visit(AbstractConfig config) { 
     throw new NotImplementedException(); 
    } 
} 

が、私はこのようにそれをオートワイヤリングによりConcreteVisitorのBeanインスタンスを使用します。

@Autowired 
private AbstractVisitor visitor; 

問題がある、私はconfigConfigAのインスタンスであるvisitor.visit(config)を呼び出すとき、それはNotImplementedExceptionを発生させます。

今、可能なすべての抽象メソッドをAbstractVisitorに宣言しましたが、別の好ましい解決策がありますか?つまり、具体的な訪問者は、親の抽象メソッドの引数に多相的なメソッドを定義できます。

ありがとうございます。

+0

はこの置き換えます。public void訪問(AbstractConfigの設定){ スロー新しいNotImplementedExceptionを(); }の場合:public void visit(AbstractConfig config);あなたのautowiringワイヤが正しいクラス – Stultuske

+0

@ Stultuskeの実装であることを確認してください、あなたのコメントをありがとうございますが、それでも動作しない、エラーを発生させます。 – tsuda7

+1

これはまた、@ @オーバーライドが重要な理由の1つです。これは、あなたがメソッドをオーバーライドしたと思っているが、実際には返信していないと思っているような問題からあなたを救います。 –

答えて

2

public void visit(AbstractConfig)は、public void visit(ConfigA)と同じではありません。 AbstractConfigがあり、visitを呼び出すと、親のメソッドが呼び出されます。

AbstractConfig con = new ConfigA(); 
visitor.visit(con); //NoImplementedException (parent's method) 

ConfigA = conA = new ConfigA(); 
visitor.visit(conA); //OK, ConcreteVisitor's method 

AbstractConfigの具体的な実装ごとに、各メソッドを宣言する必要があります。代わりに、訪問者のためのインターフェイスを使用します。

public interface Visitor { 
    public void visit(ConfigA config); 
    public void visit(ConfigB config); 
} 

@Component 
public class ConcreteVisitor implements Visitor { 

    @Override 
    public void visit(ConfigA config) { 
     // Do something 
    } 

    @Override 
    public void visit(ConfigB config) { 
     // Do something 
    } 
} 

@Autowired 
private Visitor visitor; 
+0

返信ありがとうございます。方法は、訪問(ConfigCの設定)、訪問(ConfigDの設定)など... – tsuda7

+1

訪問者のパターンの使用が非常に正当化されなければならないので、そうです。新しい 'AbstractConfig'実装を追加するたびに、' Visitor'インターフェースにメソッドを追加し、 'ConcreteVisitor'に実装する必要があります –

+0

私は画像を取得します。私がやりたいことはちょっと違います(別の実装Beanを柔軟に代用できる方が良いでしょう)が、Visitorパターンを使用することは好ましくありません。私はあなたが提案したとおりに私のコードを残します。ありがとう@bigdestroyer – tsuda7

関連する問題