`instanceof` 运算符是否违反 Liskov 替换原则?

Does `instanceof` operator violate Liskov Substitution Principle?

例如,我有 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?

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

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

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