昨日私はこの質問をしました、そして@JBNizetによって投稿された解決策は完全に機能しました。しかし、その答えと他のいくつかの答え/コメントは、私をまったく別の方向に考えさせました。
基本的に、私は次のクラスを持っています:
Load
HttpLoad extends Load
Target
HttpTarget extends Target
Controller
のController
仕事はにTarget::fire()
あり、どちらが発砲しているのかはLoad
気にしません:Target
Load
// Inside Controller.java
Target target = getTarget();
Load load = getLoad();
target.fire(load);
しかし、私はいつかを書くかもしれません、そして私はでFtpLoad extends Load
発砲することができたくありません。したがって、上記の質問の本質は、これをどのように行うかということでした。これに対する答えはジェネリックです。FtpLoad
HttpTarget
ただし、回答者が指摘したように、この解決策はLiksovの置換原則に違反しています。他の回答者/コメント提供者は、私が行っていたことが必ずしも良いOOPプラクティスではなかったことを示しているようでした。
だから今私は尋ねています:APIを公開して、不可知論者と不可知論者にController
なることができますが、それでも、リスコフの置換に違反することなく、適切なサブクラスが適切な型で起動されるように強制しますか?Load
Target
Load
Target
そして、これを(リスコフに違反せずに)行うことが不可能な場合、このような問題への通常のアプローチは何ですか?前もって感謝します!