簡體   English   中英

`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並返回結果。

不,里氏替換原則是關於子類型忠實地展示其超類型的所有屬性。 它絕不會禁止其他代碼以不同的方式處理同一類型的不同子類型。

您的示例代碼有點臭,但不是因為與 LSP 有任何沖突。

以上稱為“潛在違反LSP”。 任何用於識別超類型子類型的實例檢查都被視為潛在的違規行為。

不同子類型的實現不應該不同。 在您的情況下,除了不同的價值外,沒有其他沖突。 但這仍然可以通過使用 function 或返回匯率的值來解決,而不是檢查子類型並進行設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM