私はより良く、よりクリーンなコードを書くために、SOLIDの原則について学んでいます。この点で、LSPは適切に把握するのが少し難しいことがわかっています。
私の疑問は、サブタイプSに余分なメソッドがあり、タイプTになかった場合、これは常にLSPの違反になるのでしょうか?はいの場合、どのようにextend
私のクラスを行うのですか?
たとえば、Bird
タイプがあるとしましょう。そして、そのサブタイプはEagle
およびHumming Bird
です。現在、両方のサブタイプには、としていくつかの共通の動作がありBird
ます。しかし、Eagle
(一般的なBird
タイプには存在しない)優れた略奪行動もあるので、それを使用したい。したがって、今はこれを行うことができません:
Bird bird = new Eagle();
それで、Eagle
それらの追加の振る舞いを与えることはLSPを壊していますか?
はいの場合、それはLSP違反を引き起こすため、クラスを拡張できないことを意味しますか?
class Eagle extends Bird {
//we are extending Bird since Eagle has some extra behavior also
}
クラスの拡張は、Open / Closed原則に従って許可する必要がありますか?
よろしくお願いします!はっきりとわかるように、LSPは私を他のものと同じように混乱させています。
編集:このSOの回答を参照してください。この場合Car
も、のような追加の動作がある場合ChangeGear
、LSPに違反します。では、LSPに違反せずにクラスを拡張するにはどうすればよいでしょうか。