0

これは Java プログラミングの状況です。

クラス B はクラス A のサブクラスです。B のいくつかのインスタンスは Collection にあります。型に基づいて、instanceof を使用してコレクションからクラス B インスタンスを取得できます。ただし、これらのインスタンスをクラス B のインスタンスとして扱うことはできませんが、ダウンキャストが許可されていないため、クラス A のインスタンスとしてのみ扱うことができます。そのため、代わりにクラス A のオーバーライド ゲッターを使用して、インスタンスの小さな断片をいくつか取得する必要があります。この回避策にはいくつかの問題があります。たとえば、一部のゲッターは親クラスでは意味がなく、親クラスは抽象化できません。

より良い解決策はありますか?

4

2 に答える 2

1

キャストせずにこれを行う 1 つの方法は、ビジター パターンを使用することです。Javaでは少し冗長ですが、非常に拡張可能です...

interface Visitor {
    void visit(A a)
    void visit(B b)
}

class BOnlyVisitor implements Visitor {
    public void visit(A a) {
        throw new UnsupportedOperationException();
    }

    public void visit(B b) {
        // Do stuff with b
    }
}

interface Visitable {
    void accept(Visitor v)
}

class A implements Visitable {
    public void accept(Visitor v) {
        v.visit(this);
    }
}

class B implements Visitable {
    @Override
    public void accept(Visitor v) {
        v.visit(this);
    }
}
于 2012-12-25T20:27:12.633 に答える
0

何かを行うためにオブジェクトに情報を要求する代わりに、オブジェクトに直接それを実行するように要求します。たとえば、

int a = object.getA();
int b = object.getB();
int sum = a + b;

int sum = object.computeSum();

このように、常に 0 と見なされるためにサブクラスに getB() メソッドがない場合、次computeSum()を使用してメソッドを実装できます。

return this.a;

このばかげた例で申し訳ありませんが、それがアイデアです。ゲッターとセッターを使用してオブジェクトをデータ構造にするのではなく、オブジェクトに動作を追加します。あなたがしなければならないことの具体的な例を投稿すれば、私はもっと助けることができます.

于 2012-12-25T20:20:18.653 に答える