ホームページ  >  記事  >  リヒター置換原理とは何ですか?

リヒター置換原理とは何ですか?

青灯夜游
青灯夜游オリジナル
2020-07-28 12:01:126199ブラウズ

リスコフ置換原理は、オブジェクト指向設計の基本原理の 1 つであり、「抽象化」と「多態性」を使用して設計内の静的構造を動的構造に変更し、オブジェクト指向の安定性を維持することを提唱しています。デザイン、親近感。 「抽象化」は言語によって提供される機能であり、「ポリモーフィズム」は継承セマンティクスによって実装されます。

リヒター置換原理とは何ですか?

リスコフ置換原理 (LSP) は、1987 年に MIT コンピュータ サイエンス研究所のリスコフ女史によって提案されました。 「オブジェクト指向技術サミット会議」(OOPSLA) で発表された「階層」。彼女は、継承では、スーパークラスが所有するプロパティがサブクラスに存在することを保証する必要があると提案しました。継承では、スーパータイプ オブジェクトについて証明されたプロパティがサブタイプ オブジェクトにも適用されることを保証する必要があります。 。

リスコフ置換原則では、主に継承に関するいくつかの原則、つまり、継承を使用する必要がある場合、継承を使用しない場合、およびその中に含まれる原則について説明します。 Liskov 置換はもともと継承再利用の基礎であり、基底クラスとサブクラス間の関係を反映し、開始と終了の原則を補足し、抽象化を達成するための特定の手順を規定します。

リスコフ置換原理の役割

リスコフ置換原理の主な機能は次のとおりです。

1. リスコフ置換原理は、開閉原理を実現する重要な方法の 1 つです。

2. 継承における親クラスのオーバーライドによって引き起こされる再利用性の低下という欠点を克服します。

3. アクションの正確性を保証するものです。つまり、クラスの拡張によって既存のシステムに新しいエラーが導入されることはなく、コード エラーの可能性が減ります。

リスコフ置換原則の実装方法

リスコフ置換原則とは、一般的に言えば、サブクラスは親クラスの機能を拡張できますが、元のクラスの機能を変更することはできません。親クラスの関数。言い換えると、サブクラスが親クラスを継承する場合、新しい関数を完成させるために新しいメソッドを追加する場合を除き、親クラスのメソッドをオーバーライドしないようにしてください。

親クラスのメソッドをオーバーライドして新しい関数を完成させた場合、記述は簡単ですが、継承システム全体の再利用性は比較的低く、特にポリモーフィズムが頻繁に使用される場合、プログラムが実行される可能性があります。誤差が非常に大きいです。

プログラムがリスコフ置換原則に違反している場合、継承されたクラスのオブジェクトでは、基本クラスが表示される場所で実行時エラーが発生します。このときの修正方法は、元の継承関係を解除し、両者の関係を再設計することとなります。

リスコフ置換原理の例ですが、最も有名なのは「正方形は長方形ではない」です。もちろん、似たような例は世の中にもたくさんあります。たとえば、ペンギン、ダチョウ、キウイは生物学的には鳥に分類されますが、クラス継承関係から見ると、「鳥」としての飛行機能を継承できないため、 「bird」のサブクラスとして定義することはできません。同様に、「風船魚」は泳げないので「魚」の下位カテゴリとして定義できませんし、「おもちゃの大砲」は敵を爆破できないので「大砲」の下位カテゴリとして定義できません。

以下では、リヒター置換原則を説明するための例として「キウイは鳥ではない」を使用します。

[例 2] 「キウイは鳥ではない」の例におけるリヒター置換原理の適用。

分析: 鳥は通常空を飛びますが、たとえばツバメの飛行速度は時速約 120 キロメートルです。しかし、ニュージーランドのキウイは羽が退化しているため、飛ぶことができません。例を設計し、これら 2 羽の鳥が 300 キロメートルを飛ぶのにかかる時間を計算するとします。明らかに、ツバメを使用してこのコードをテストすると、結果は正しく、必要な時間を計算できますが、キウイを使用してテストすると、結果は「ゼロ除算例外」または「無限大」になります。これは明らかに期待と一致していません。クラス図は図 1 に示すとおりです。

リヒター置換原理とは何ですか?

プログラム コードは次のとおりです。

package principle;
public class LSPtest
{
    public static void main(String[] args)
    {
        Bird bird1=new Swallow();
        Bird bird2=new BrownKiwi();
        bird1.setSpeed(120);
        bird2.setSpeed(120);
        System.out.println("如果飞行300公里:");
        try
        {
            System.out.println("燕子将飞行"+bird1.getFlyTime(300)+"小时.");
            System.out.println("几维鸟将飞行"+bird2.getFlyTime(300)+"小时。");
        }
        catch(Exception err)
        {
            System.out.println("发生错误了!");
        }
    }
}
//鸟类
class Bird
{
    double flySpeed;
    public void setSpeed(double speed)
    {
        flySpeed=speed;
    }
    public double getFlyTime(double distance)
    {
        return(distance/flySpeed);
    }
}
//燕子类
class Swallow extends Bird{}
//几维鸟类
class BrownKiwi extends Bird
{
    public void setSpeed(double speed)
    {
           flySpeed=0;
    }
}

プログラムの実行結果は次のとおりです。

如果飞行300公里:
燕子将飞行2.5小时.
几维鸟将飞行Infinity小时。

プログラム実行エラーは次のとおりです: kiwi Bird Birds の setSpeed(double Speed) メソッドがオーバーライドされました。これはリスコフ置換原則に違反します。正しいアプローチは、キーウィの元の継承関係をキャンセルし、鳥とキーウィのより一般的な親クラス (動物クラスなど) を定義することです。どちらも実行する機能があります。キウイの飛行速度は 0 ですが、走行速度は 0 ではありません。300 キロメートルを走るのにかかる時間を計算できます。

クラス図を図 2 に示します。

リヒター置換原理とは何ですか?

関連知識の詳細については、PHP 中国語 Web サイト をご覧ください。

以上がリヒター置換原理とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。