1
在我的GWT应用程序,我有一个类,像这样:GWT的ActivityMapper是否违反了Liskov替换原则?
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's的if/else级联可能不会自动违反LSP。感谢提到访问者模式...似乎有更多关于此方法的实现的讨论[这里](http://stackoverflow.com/questions/5802747/eliminating-gwt-activitymapper-boilerplate)。 – Jay