[英]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
并返回结果。
不,里氏替换原则是关于子类型忠实地展示其超类型的所有属性。 它绝不会禁止其他代码以不同的方式处理同一类型的不同子类型。
您的示例代码有点臭,但不是因为与 LSP 有任何冲突。
以上称为“潜在违反LSP”。 任何用于识别超类型子类型的实例检查都被视为潜在的违规行为。
不同子类型的实现不应该不同。 在您的情况下,除了不同的价值外,没有其他冲突。 但这仍然可以通过使用 function 或返回汇率的值来解决,而不是检查子类型并进行设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.