【问题标题】:Does `instanceof` operator violate Liskov Substitution Principle?`instanceof` 运算符是否违反 Liskov 替换原则?
【发布时间】:2020-06-27 05:31:12
【问题描述】:

例如,我有CurrencyExchange,它们处理Currency 的各种实现。我想为窗帘货币加价,我就是这样做的

interface Currency { double rate();}
interface Exchange { double convert(Currency currency, double money); }
class PrivateBank implements Exchange {
    @Override
    public double convert(Currency currency, double money) {
        double extra_rate = 1.0;
        if (currency instanceof CanadaDollar) { /// ?
            extra_rate = 1.05;
        }
        return money * currency.rate() * extra_rate;
    }
}

这里违反了 LSP 吗?

【问题讨论】:

    标签: java oop solid-principles


    【解决方案1】:

    没有。 Liskov 替换原则是关于子类型忠实地展示其超类型的所有属性。它绝不禁止其他代码以不同方式处理同一类型的不同子类型。

    您的示例代码有点臭,但不是因为与 LSP 有任何冲突。

    【讨论】:

      【解决方案2】:

      不可以,因为Currency 的任何实现都可以传入convert 并返回结果。

      【讨论】:

      • 但是加元的逻辑是加上CanadaDollar类。如果我添加另一个恰好也是 CAD 的实现怎么办?我无法告诉PrivateBank 以同样的方式处理我的新实现。
      • 如果CanadaDollarCurrency 的实现,那么它不会违反LSP,但是是的,您必须使用任何新货币或汇率变化来更新PrivateBank。更好的解决方案是将extra_rate 抽象为Currency,以便每种货币对其各自的汇率负责。
      猜你喜欢
      • 2015-01-01
      • 2011-09-09
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2020-02-03
      • 1970-01-01
      • 2017-07-04
      相关资源
      最近更新 更多