リスコフ置換原理
リスコフ置換原理 LSP では、基底クラスとサブクラスの関係について説明します。この関係が存在する場合にのみ、リヒター置換関係が存在します。 2 つの特定のクラス A と B の間の関係が LSP の設計に違反する場合 (B から A への継承関係であると仮定)、特定の状況に応じて次の 2 つの再構築ソリューションのいずれかを選択できます。
<?php //举例说明继承的风险,我们需要完成一个两数相减的功能,由类A来负责。 class a{ public $width; public $height; public function func1($a, $b){ return $a - $b; } } $a = new a(); echo $a->func1(100,50); //运行结果100-50=50
その後、新しい関数を追加する必要があります。2 つの数値の加算を完了し、それを 100 で合計します。クラス B がこれを担当します。つまり、クラス B は 2 つの関数を完了する必要があります。
クラス B を使用してクラス A を継承するコードは次のとおりです。
class b extends a{ public function func1($a, $b){ return $a + $b; } public function func2($a, $b){ return $this->func1($a, $b) + 100; } } $b = new b(); echo $b->func2(100, 50);
クラス B が誤って親クラスのメソッドを書き換えたと仮定します。メソッドに名前を付けるときに、減算関数を実行するすべてのコードがクラス B の書き換えられたメソッドを呼び出します。これにより、本来は正常に実行されていた関数 fun1 でエラーが発生します (エラーの理由は、減算が加算になり、他のユーザーが実行したためです) コードが 1 人の人間によって書かれたものだと常に考えないでください! そして、人々はコードを 1 行ずつ読む時間はなく、ルールに従ってコードを適用するだけです)。
リスコフ置換原則は一般的に次のとおりです。 サブクラスは親クラスの機能を拡張できますが、親クラスの元の機能を変更することはできません。 これには次の 4 つの意味レベルが含まれます:
1. サブクラスは親クラスの抽象メソッドを実装できますが、親クラスの非抽象メソッドをオーバーライドすることはできません。
2. 独自の独自のメソッドをサブクラスに追加できます。
3. サブクラスのメソッドが親クラスのメソッドをオーバーライドする場合、メソッドの前提条件 (つまり、メソッドの仮パラメータ) は、親クラスのメソッドの入力パラメータよりも緩くなります。
4. サブクラスのメソッドが親クラスの抽象メソッドを実装する場合、メソッドの事後条件 (メソッドの戻り値) は親クラスの事後条件よりも厳しくなります。
これは信じられないことのように思えます。なぜなら、私たち自身のプログラミングではリスコフ置換原則に違反することがよくあることがわかりますが、それでもプログラムは正常に実行されます。それで、誰もがこの疑問を抱くでしょう、もし私がリスコフ置換原則に従わないと主張したら、どのような結果になるでしょうか?
その結果、作成したコードで問題が発生する可能性が大幅に高まります。
以上がリヒターの置換原理とは何ですか? (例えば)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。