2

同じスーパークラスの異種サブクラスを含むことができるある種のデータ構造が必要であり、それらはすべて自分で実装しました。

これまでのところ、ArrayList<SuperClass> list = new ArrayList<SuperClass>(); リストの各スロットをいずれかのサブクラスにキャストできると想定していますが、これはうまく機能していません。

前述のことを効率的に行う方法が必要です。

ありがとう!

4

1 に答える 1

5

存在する任意のデータ構造で実行できます。Listまたはをお勧めしSetます。例えば:

Collection<Super> supers = new ArrayList<Super>();  

今こう言うと:

リストの各スロットをいずれかのサブクラスにキャストできると想定していますが、

それは無効な仮定です。コレクションは拡張するすべてのオブジェクトを保持しますが、Super各要素を任意にキャストすることはできません。instanceofそのタイプの機能を探している場合は、各要素でテスト を行う必要があります。例を次に示します。

for(Super currentSuper : supers)  
{  
    if(currentSuper instanceof SubA)  
    {  
         SubA subA = (Suba) currentSuper);  
         // do stuff with subA
    }  
    else if(currentSuper instanceof SubB)  
    {  
         SubB subB = (SubB) currentSuper);  
         // do stuff with subB
    } 
}  

必要に応じて範囲を指定します。

今ヴラドのポイントで:

はるかに優れた設計は、実際のクラスが何であるかをテストするのではなく、仮想メソッドを呼び出すだけで、どのような場合でも正しいことを行います.

すべての潜在的なサブクラスの機能を保証でき、クラスをオーバーライドする人々に問題がない場合 (それらを final とマークしていない場合)、test のインスタンスを実行する必要はありません。代わりに、コードは次のように単純になります。

for(Super currentSuper : supers)  
{  
    currentSuper.doSomethingNifty();
}  
于 2012-11-04T22:05:34.537 に答える