2010-12-04 12 views
0

こんにちは私はAbstract Employeeの親クラスを持っていると私は子供を持ってSecretary, Engineer, Technician私はArrayList<Employee> employees;を持っていると私はランダムに従業員=新しい秘書か新しいエンジニアを作った。親クラスのarraylistの各子供のクラスを区別する

誰が誰であるかを知る方法はありますか?質問がよく聞かれなかったら私の無知のために謝罪する。

+0

(秘書はエンジニアに昇進することがあります) –

答えて

5

理想的には、気にしないでください。ある特定のクラスに応じて異なることをする必要がある場合は、Employeeの(おそらく抽象的な)メソッドに移り、サブクラスがオーバーライドして別々に実装する必要があります。次に、リストを調べ、そのメソッドをすべての要素で呼び出すだけです。

これは適切なオブジェクト指向設計になります。

+0

各従業員に必要なものは何でも。 employee.work()。各従業員は、発信者/ループコードではなく、自分が何をする必要があるかを知っています。 –

+0

はい、それは私が "適切なO-Oデザイン"を探していたものです。 –

1

ネイティブ演算子instanceofを使用できます。このような

何か:

List<Employee> yourList; 
for (Employee e : yourList) { 
    if (e instanceof Secretary) { 
     Secretary s = (Secretary)e; 
     // do something with s 
    } else if (e instanceof Engineer) { 
     Engineer eng = (Engineer)e; 
     // do something with eng 
    } 
    // you get the idea... 
} 

instanceofの使用を乱用することは常に良い考えではない、と述べました。クラス内の多態性を使用することで、より洗練されたオブジェクト指向のソリューションを提供します。

0

確かにinstanceofを使用することはできますが、デザインの目的を無効にします。 Employeeの別のサブタイプを追加するたびに、潜在的にたくさんのコード(このリストで動作するすべての場所)を変更する必要があります。

変更の数を減らす(または少なくとも1つの管理可能な場所に保存する)別の方法は、Visitorパターンまたは多態性を使用して、実行時にタイプに基づいて何を行うかをコードに把握させることです。

1

このような状況でvisitor patternを実装することを強くお勧めします。

またLion sおよびDeer Sによって拡張Animal Sのリストのコンテキストでこの正確な問題を解決し完全な例over hereを見てみたいことがあります。

関連する問題