1

在我的 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 对象是框架的一部分,界面暗示这就是它的用途。

但是,根据Liskov 替换原则,接受类型但对子类进行类型检查以推断要采取什么行动的方法违反了该原则。

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

4

1 回答 1

1

的作用ActivityMapper是将 a 映射Place到 a Activity,其中映射规则是完全自由的。
这种 if/else 级联的原因是 Java 不支持multiple dispatch,但在我看来这并不意味着它违反了 LSP(或者至少,好吧,你在 Java 中别无选择,所以它是一个非问题;您可以使用访问者模式——这就是 Spring Roo 生成的——但这并没有改变太多东西)。

于 2011-12-03T16:59:32.427 回答