[英]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.