GWT';s ActivityMapper违反了Liskov替代原则?

GWT';s ActivityMapper违反了Liskov替代原则?,gwt,liskov-substitution-principle,Gwt,Liskov Substitution Principle,在我的GWT应用程序中,我有这样一个类: public class AppActivityMapper implements ActivityMapper { @Override public Activity getActivity(Place place) { if(place instanceof ThisPlace) { return new ThisActivity((ThisPlace)place); }

在我的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、Activity和Place对象是框架的一部分,接口意味着这就是它的使用方式

然而,根据,一个方法接受一个类型,但对子类进行类型检查以推断要采取什么操作,这违反了原则


GWT的ActivityMapper接口本质上鼓励违反LSP吗?或者有没有另一种符合LSP的方法来编写我没有想到的方法?

活动映射器的作用是将
位置映射到
活动,映射规则完全自由。

导致这种if/else级联的原因是Java不支持,但在我看来,这并不意味着它违反了LSP(或者至少,好吧,在Java中你没有其他选择,所以这不是问题;你可以使用访问者模式——这是SpringRoo生成的——但这不会改变很多事情).

活动标签的作用是将
位置
映射到
活动
,映射规则完全自由。

造成这种if/else级联的原因是Java不支持,但我认为这并不意味着它违反了LSP(或者至少,好吧,在Java中你没有其他选择,所以这不是问题;你可以使用访问者模式——这是Spring Roo生成的——但这不会改变很多事情)。

阅读更多信息后,我猜违反LSP取决于是否可以通过让客户机使用子类调用此方法来破坏客户机。这似乎实际上是映射方法的意图,因此在这种情况下,instanceof的if/else级联可能不会自动违反LSP。感谢您提及访客模式。。。关于这个方法的实现似乎有更多的讨论。经过更多的阅读,我想违反LSP取决于是否可以通过让客户机使用子类调用这个方法来破坏客户机。这似乎实际上是映射方法的意图,因此在这种情况下,instanceof的if/else级联可能不会自动违反LSP。感谢您提及访客模式。。。对于这种方法的实现似乎有更多的讨论。