`instanceof` 运算符是否违反 Liskov 替换原则?
Does `instanceof` operator violate Liskov Substitution Principle?
例如,我有 Currency
和 Exchange
,它处理 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 有任何冲突。
例如,我有 Currency
和 Exchange
,它处理 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 有任何冲突。