Liskov Substitution Principleは、インターフェイスを実装するクラスにも適用されますか?


17

LSPは、クラスがその基本クラスの代わりになるべきであると述べています。つまり、派生クラスと基本クラスは意味的に同等でなければなりません。

しかし、LSPはインターフェイスを実装するクラスにも適用されますか?言い換えると、クラスによって実装されたインターフェイスメソッドが、ユーザーが期待するものと意味的に異なる場合、これはLSPの違反と見なされますか?


7
はい。インターフェイス、抽象クラス、完全クラスの場合、LSPに違反するのとまったく同じ理由と結果は重要ではありません。LSPは、消費者が一般的な方法であなたのタイプを扱うことができるように、期待を設定して満たすことです。
ジミー・ホッファ

5
概して(違いは知っていますが、ここで一般化しています)、インターフェースは純粋な抽象クラス(C ++用語)にやや似ているため、Liskovはインターフェースとそれらを実装するクラスに適用する必要があります。
ジェシーC.スライサー

3
NB私がよく知っているLSPの定式化は、派生クラスや基本クラスではなく、サブタイプについて語っています。理由は継承に固有のものではなく、他の種類のサブタイプにも同様に当てはまるためです。

回答:


17

場合インターフェイスメソッドクラスによって実装は、ユーザが、これはLSPの違反と見なされるであろう、それがあることを期待するものと意味的に異なりますか?

実装が、インターフェイスの不変条件とそのメソッドの事前条件および事後条件によって文書化された動作と意味的に異なる場合、答えは「はい」であり、LSPの違反になります。この原則は、抽象化側がクラスの形式で存在することを必要とせずに、抽象化とその実装のルールを確立します。

ただし、ユーザーが期待するものについて話すと、答えは「必ずしも必要ではない」ことになります。ユーザーは間違った期待をする権利があります。


「実装が、インターフェースの不変式によって文書化された動作と意味的に異なる場合」「インターフェースの不変式」とはどういう意味ですか?
user1483278

3
@ user1483278 型不変式に関する記事です。記事ではそれらを「クラス不変式」と呼びますが、説明はインターフェースにも適用されます。不変条件は、構築時に確立され、インスタンスのライフタイムを通じて維持される条件です。インターフェースプロパティがある場合、例えば、Nameに設定することができないnull、次にobj.Name != nullであると言われている不変そのインターフェイスの。
dasblinkenlight

1
通常、不変条件について説明する場合、コードの一部を記述して、オブジェクトの存続期間全体にわたって不変条件が維持されることを確認できます。ただし、一般的に、不変式を平易な英語で口頭で記述する方が簡単です。
-rwong
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.