1

どうやって解決すればいいのかわからないデザインの問題があります。基本的に、私はビジターを使用して特定のクラスのインスタンスを更新しています。将来的には、Updateクラスの拡張として、さまざまな種類の更新を実装できるようにしたいと考えています。また、さまざまな種類のオブジェクト(すべて基本クラスから派生)を更新できるようにしたいです。ので、私は持っています:

public class Update
{
    public void visit(A obj) { /* generic */ }
    public void visit(B obj) { /* specific for B */ }
    public void visit(C obj) { /* specific for C */ }
}

public class A 
{
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class B extends A { /* ... */ }

public class C extends A { /* ... */ }

にインスタンスがありList<A>、各オブジェクトに最も具体的な更新を適用したいと思います。ただし、リストの要素の1つに更新を適用しようとするvisit(A)と、より具体的な要素ではなく、常に呼び出されます。それは、そうList<A>ではないからだと思いますが、ポリモーフィズムがそれを処理することを期待します。CとBを区別しないことが理にかなっている場合があるため、演算子を削除することはできません。メッセージをオーバーロードにディスパッチせずにこれを解決する方法について何か考えがありますか?List<B>List<C>visit(A)visit(A)

ありがとうございました

4

1 に答える 1

4

acceptメソッドをオーバーライドする必要があります

public class Update
{
    public void visit(A obj) { /* generic */ }
    public void visit(B obj) { /* specific for B */ }
    public void visit(C obj) { /* specific for C */ }
}

public class A 
{
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class B extends A {
    public void accept(Update u) 
    {
        u.visit(this);
    }
}

public class C extends A { 
    public void accept(Update u) 
    {
        u.visit(this);
    }
}
于 2012-02-13T02:40:23.530 に答える