リヒター定義された原則を置き換えます
記事で1987年に出版され氏リース・コーブ(リスコフ)のMITコンピュータサイエンス研究所によるリヒター置換原則(リスコフの置換原則、LSP)「オブジェクト指向技術のサミット」(OOPSLA)」データ抽象化と階層「(データ抽象化と階層)が引き出された、彼女は尋ねた:継承は子クラスのスーパー保有物件がまだ有効であることを確認する必要があります(継承が証明任意のプロパティことを保証しなければならないスーパータイプについてもサブタイプのオブジェクトのために保持しているオブジェクト)。
リヒターの置換原則は、継承を使用する必要がある場合、ときに継承を使うべきではないです相続の主要な原則のいくつかを示しており、それは原則が含まれています。リヒター、基底クラスとサブクラスの間の関係を反映して、もともと継承ベースの再利用を、置き換える開閉の原則を補完する、それが抽象的を達成するための具体的な手順については、仕様です。
リヒターは、の原則の役割を置き換えます
リヒターの置換原則の主な役割は次の通り。
- リヒターの置換原則は開閉の原則を達成するための一つの重要な方法です。
- これは、継承の欠点が伴う再利用性の劣化に親クラスをオーバーライド克服します。
- それは行動の正しさを確保することです。拡張の種類は、既存のシステムに新しいエラーを導入しないこと、それはエラーコードの可能性を低減します。
リヒターは、の原則の実施を置き換えます
人気の用語リヒター置換原則はこれです:サブクラスは親クラスの機能を拡張することができますが、元の関数の親クラスを変更することはできません。言い換えれば、サブクラスは、新しい機能を完了するために、新しいメソッドを追加することに加えて、親クラスを継承しますが、親クラスのメソッドをオーバーライドしないようにしようとします。
新しい機能は、方法によって達成されている場合は親クラスをオーバーライドする、書き込みアップは簡単ですが、比較的貧しい再利用性は、実行エラー確率が非常に大きくなり、より頻繁にシステム全体、多状態の、特に使用を継承します。
プログラムは、リヒターの置換原則に違反した場合は、継承されたオブジェクトクラスは、エラーがベースクラスの代わりに発生し実行されます。そして、その補正方法は次のとおりです。オリジナルの継承の廃止は、それらの間の関係を再設計します。
リヒター上の置換原則の例としては、最も有名なのは「ない、正方形、長方形」です。もちろん、生活の中で、このような生物学的観点から除算するペンギン、ダチョウやキウイなど多くの類似例が、ありますが、彼らは鳥に属します。しかし、クラス階層の観点から、彼らは「鳥」フライを継承することはできませんので、機能は、ので、彼らは「鳥」のサブクラスとして定義することはできません。「バルーン魚」のためには、泳ぐことができない「魚」サブクラスとして定義することはできません。また、;「おもちゃの銃は」敵を揚げることができない、それが「銃」のサブクラスとして定義され、そうではありません。
以下のリヒター置換原理を説明するための例として、「キウイ鳥ではありません」。
〔実施例2〕置換のインスタンス「キウイは、鳥ではない」の原理のリヒター・アプリケーションは、。
分析:鳥は通常、時速約120キロのスピードを飛ぶツバメのように飛びます。しかし、翼の劣化によるニュージーランドのキウイは飛ぶことができません。あなたは一つの例を設計する場合、これらの二つの鳥の計算が費やされるために時間の300キロを飛行。明らかに、このコードをテストするためにツバメを取る、結果が正しい、必要な時間を計算することができます。しかし、テストしたキウイを取るために、結果は明らかにそのクラス図の期待を満たしていない、「ゼロ例外で除算」や「無限大」を発生します図1に示します。
図クラス1「キウイない鳥(S)」
コードは以下の通りであります:
- パッケージの原則;
- パブリッククラスLSPtest {
- パブリック静的ボイドメイン(文字列[]引数) {
- 鳥のbird1は= 新しいツバメ();
- 鳥のbird2は= 新しいBrownKiwi ();
- bird1 。setSpeed (120 )。
- bird2 。setSpeed (120 )。
- システムの.out 。のprintln ("飛んで300キロの場合:" );
- してみてください {
- システムの.out 。のprintln ("フライングくん" + bird1 。GetFlyTime (300 )+ "時間" )。
- システムの.out 。のprintln ("フライングキウイ" + BIRD2 。GetFlyTime (300 )+ "時間" )。
- }
- キャッチ(例外ERR ) {
- システムの.out 。のprintln ("エラーが発生しました!" );
- }
- }
- }
- //鳥
- クラス鳥
- {
- FlySpeedを倍増。
- 公共のボイドsetSpeed (倍速)
- {
- FlySpeed =スピード。
- }
- 公共ダブルgetFlyTime (ダブル距離)
- {
- リターン(距離/ FlySpeed )。
- }
- }
- //クラスツバメ
- クラスツバメは延び鳥} {
- //キウイクラス
- クラスBrownKiwiは鳥を拡張します
- {
- 公共のボイドsetSpeed (倍速)
- {
- FlySpeed = 0 ;
- }
- }
次のようにプログラムの動作結果は以下のとおりです。
あなたは300キロを飛行している場合: スワローズは2.5時間飛行します。 キウイは、インフィニティの時間を飛行します。
クラスは、交換リヒターの原則に反している(倍速)法、setSpeedキウイ鳥を上書きします。その理由は、プログラムがエラーを実行していることです。正しいアプローチは、次のとおりです。オリジナルの継承キウイの廃止、動物等の親鳥やキウイ、より多くの一般的な定義は、彼らが実行する機能を持っています。キウイの飛行速度がゼロであるが、走行速度が0ではありませんが、それは300キロのランニング時間を過ごしたことを計算することができます。クラス図は、図1に示します。
図2は、クラスの一例を示す「キウイ動物です」