は、私のようなクラスを持っているので:GWTのActivityMapperはLiskovの置換原理に違反していますか?私のGWTアプリケーションで
public class AppActivityMapper implements ActivityMapper {
@Override public Activity getActivity(Place place) {
if(place instanceof ThisPlace) {
return new ThisActivity((ThisPlace)place);
}
if(place instanceof ThatPlace) {
return new ThatActivity((ThatPlace)place);
}
if(place instanceof AnotherPlace) {
return new AnotherActivity((AnotherPlace)place);
}
// you get the idea
}
}
ActivityMapper、活動、および場所のオブジェクトは、フレームワークの一部であり、インターフェースが、これはそれが使用されることを意図された方法であることを意味します。
しかし、Liskov Substitution Principleによれば、タイプを受け入れるが、サブクラスがどのようなアクションを取るべきかをタイプチェックするメソッドは、原則に違反します。
GWTのActivityMapperインターフェイスは、性質上、LSPの違反を奨励していますか?あるいは、私が考えていないそのメソッドをコード化する別のLSP準拠の方法がありますか?
さらに読むと、LSPを違反するかどうかは、クライアントがこのメソッドをサブクラスで呼び出すことによって中断できるかどうかによって決まると思います。これは実際にマッピング方法の意図であるようです。この場合、instanceofのif/elseカスケードが自動的にLSPの違反ではないかもしれません。訪問者パターンに言及してくれてありがとう...このメソッド(here)の実装についてもっと議論があるようです(http://stackoverflow.com/questions/5802747/eliminating-gwt-activitymapper-boilerplate)。 – Jay