こんにちは私はAbstract Employee
の親クラスを持っていると私は子供を持ってSecretary, Engineer, Technician
私はArrayList<Employee> employees;
を持っていると私はランダムに従業員=新しい秘書か新しいエンジニアを作った。親クラスのarraylistの各子供のクラスを区別する
誰が誰であるかを知る方法はありますか?質問がよく聞かれなかったら私の無知のために謝罪する。
こんにちは私はAbstract Employee
の親クラスを持っていると私は子供を持ってSecretary, Engineer, Technician
私はArrayList<Employee> employees;
を持っていると私はランダムに従業員=新しい秘書か新しいエンジニアを作った。親クラスのarraylistの各子供のクラスを区別する
誰が誰であるかを知る方法はありますか?質問がよく聞かれなかったら私の無知のために謝罪する。
理想的には、気にしないでください。ある特定のクラスに応じて異なることをする必要がある場合は、Employee
の(おそらく抽象的な)メソッドに移り、サブクラスがオーバーライドして別々に実装する必要があります。次に、リストを調べ、そのメソッドをすべての要素で呼び出すだけです。
これは適切なオブジェクト指向設計になります。
各従業員に必要なものは何でも。 employee.work()。各従業員は、発信者/ループコードではなく、自分が何をする必要があるかを知っています。 –
はい、それは私が "適切なO-Oデザイン"を探していたものです。 –
ネイティブ演算子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
の使用を乱用することは常に良い考えではない、と述べました。クラス内の多態性を使用することで、より洗練されたオブジェクト指向のソリューションを提供します。
確かにinstanceof
を使用することはできますが、デザインの目的を無効にします。 Employeeの別のサブタイプを追加するたびに、潜在的にたくさんのコード(このリストで動作するすべての場所)を変更する必要があります。
変更の数を減らす(または少なくとも1つの管理可能な場所に保存する)別の方法は、Visitorパターンまたは多態性を使用して、実行時にタイプに基づいて何を行うかをコードに把握させることです。
このような状況でvisitor patternを実装することを強くお勧めします。
またLion
sおよびDeer
Sによって拡張Animal
Sのリストのコンテキストでこの正確な問題を解決し完全な例over hereを見てみたいことがあります。
(秘書はエンジニアに昇進することがあります) –