代わりに機能の検索を使用してください。
子クラスへのアクセスを与えないでください、それらは親クラスの実装を考慮してください。
次に、いくつかの機能、機能を指定するインターフェースを定義します。
interface Child1Specific {
void child1SpecificMethod();
}
使用法:
Parent parent = ...
Child1Specific specific = parent.lookup(Child1Specific.class);
if (specific1 != null) {
specific1.child1SpecificMethod();
}
この検出メカニズムは非常に柔軟です。継承の代わりに委任を使用すると、かなりやりがいがあります。子クラスを持つ必要がなくなったことに注意してください。
またはjava 8(いくつかのバリエーションが可能であり、インターフェースも機能する可能性がある場合):
Optional<Child1Specific> specific = parent.lookup(Child1Specific.class);
if (specific1.isPresent()) {
specific1.get().child1SpecificMethod();
}
Parentクラスで、いくつかの機能のルックアップを作成します。
public class Parent {
protected final Map<Class<?>, Object> capabilities = new HashMap<>();
protected final <T> void registerCapability(Class<T> klass, T object);
public <T> T lookup(Class<T> klass) {
Object object = capabilities.get(klass);
return object == null ? null : klass.cast(object);
}
またはJava 8では:
public <T> Optional<T> lookup(Class<T> klass) {
Object object = capabilities.get(klass);
return Optional.ofNullable(klass.cast(object));
}
子クラス:
class Child1 extend Parent implements Child1Specific {
Child1() {
registerCapability(Child1Specific.class, this);
}
}
またはより動的:
class Child1 extends Parent {
private Child1Specific specific = new Child1Specific() {
... Parent.this ...
};
Child1() {
registerCapability(Child1Specific.class, specific);
}
}