1

私は今夜​​、ワードのwikiでリスコフの置換原則の元の声明に出くわしました。

ここで必要なのは、次の置換プロパティのようなものです。タイプSのオブジェクトo1ごとに、タイプTのオブジェクトo2があり、Tに関して定義されたすべてのプログラムPに対して、o1が置換されたときのPの動作は変更されません。 o2の場合、SはTのサブタイプです。」-Barbara Liskov、Data Abstraction and Hierarchy、SIGPLAN Notices、23、5(1988年5月)。

私は常に述語論理の解析に夢中になっているので(最初はCalc IVに失敗しました)、上記がどのように変換されるかを理解しています。

基本クラスへのポインタまたは参照を使用する関数は、それを知らなくても派生クラスのオブジェクトを使用できる必要があります。

私が理解していないのは、Liskovが説明するプロパティが、SがTのサブタイプであり、その逆ではないことを意味している理由です。

たぶん私はまだOOPについて十分に知らないのですが、なぜLiskovのステートメントは可能性S-> Tのみを許可し、T-> Sを許可しないのですか?

4

3 に答える 3

0

架空のプログラムのセットP(Tの観点から)はSの観点から定義されていないため、Sについてはあまり説明されていません。一方、SはそのセットのTと同様に機能すると言います。プログラムPなので、SとそのTとの関係について結論を出すことができます。

これについて考える1つの方法は、PがTの特定のプロパティを要求することです。Sはたまたまそれらのプロパティを満たします。おそらく、「Sのすべてのo1はTにもある」とさえ言えます。この結論は、単語のサブタイプを定義するために使用されます。

于 2010-09-05T07:05:51.273 に答える
0

派生クラスは、その基本クラスのパブリック インターフェイスを継承し、継承された実装を使用するか、同様に動作する実装を提供することが期待されます (たとえば、Count()メソッドは、要素がどのように格納されているかに関係なく、要素の数を返す必要があります)。

基本クラスは、その派生クラスのいずれか(すべては言うまでもなく)のインターフェースを必ずしも持っているとは限らないため、基本クラスへの任意の参照が指定された派生クラスの代わりになると期待しても意味がありません。基本クラスのインターフェースでサポートされているインターフェースのサブセットのみが必要であるように見えても、そうではない場合があります (たとえば、特定の派生クラスのシャドウ メソッドが参照されている可能性があります)。

于 2010-09-05T18:02:05.433 に答える
0

sepp2k が指摘したように、他の投稿でこれを説明する複数のビューがあります。これが私の2セントです。このように見るのが好きです

タイプ TallPerson の各オブジェクト o1 に対してタイプ Person のオブジェクト o2 が存在し、Person に関して定義されたすべてのプログラム P について、o1 が o2 に置き換えられても P の動作は変更されない場合、TallPerson は Person のサブタイプです。(S を TallPerson に、T を Person に置き換えます)

通常、一部の基本クラスを派生させるオブジェクトは、拡張されているため、より多くの機能を備えているという観点があります。ただし、機能が増えると、それを特殊化し、それらを使用できる範囲を縮小して、その基本クラス (より広いタイプ) のサブタイプになります。

于 2010-09-05T16:44:05.073 に答える