タグ付けされた質問 「liskov-substitution」

オブジェクト指向設計におけるリスコフ置換原理についての質問。

4
C#のインターフェイスで前提条件(LSP)を指定する方法は?
次のインターフェースがあるとしましょう- interface IDatabase { string ConnectionString{get;set;} void ExecuteNoQuery(string sql); void ExecuteNoQuery(string[] sql); //Various other methods all requiring ConnectionString to be set } 前提条件は、いずれかのメソッドを実行する前にConnectionStringを設定/初期化する必要があることです。 IDatabaseが抽象クラスまたは具象クラスである場合、コンストラクターを介してconnectionStringを渡すことにより、この前提条件をある程度達成できます。 abstract class Database { public string ConnectionString{get;set;} public Database(string connectionString){ ConnectionString = connectionString;} public void ExecuteNoQuery(string sql); public void ExecuteNoQuery(string[] sql); //Various other methods all requiring …

5
Liskov Substitution Principleは、IntrospectionまたはDuck Typingと互換性がありませんか?
アヒル型言語で通常行われているように、オブジェクトを自分自身で検査できる言語では、リスコフ置換原理を遵守できないことを正しく理解できますか? 例えば、Rubyで、クラスの場合B、クラスから継承Aし、すべてのオブジェクトのためxのA、x.class返すために起こっているAが、場合xの目的はB、x.class返却するつもりはありませんA。 LSPの声明は次のとおりです。 ましょうQ(x)はオブジェクトに関するプロパティ証明可能であるxは型のT。次いで、Q(y)は、オブジェクトのために証明可能であるべきであるY型のS Sは、のサブタイプであるT。 たとえば、Rubyでは、 class T; end class S < T; end プロパティq(x) =で見られるように、この形式のLSPに違反していますx.class.name == 'T' 添加。答えが「はい」(イントロスペクションとLSPの互換性がない)の場合、私の他の質問は次のようになります。性質。 更新。参考のために、ウェブで見つけたLSPの別の定式化を以下に示します。 基本クラスへのポインターまたは参照を使用する関数は、知らないうちに派生クラスのオブジェクトを使用できる必要があります。 そしてもう一つ: SがTの宣言されたサブタイプである場合、タイプSのオブジェクトは、タイプTのオブジェクトとして扱われる場合、タイプTのオブジェクトとして動作するはずです。 最後のものには次の注釈が付いています。 LSPはすべて、オブジェクトの予期される動作に関するものであることに注意してください。オブジェクトの予想される動作が明確である場合にのみ、LSPを追跡できます。 これは元のものよりも弱いようで、観察できるかもしれませんが、それが形式化されること、特に予想される動作を誰が決めるかを説明したいと思います。 LSPはプログラミング言語のクラスのペアのプロパティではなく、クラスのペアと特定のプロパティのセットのプロパティであり、祖先クラスによって満たされていますか?実際には、これは、LSPを尊重するサブクラス(子孫クラス)を構築するために、祖先クラスの考えられるすべての使用法を知っている必要があることを意味しますか?LSPによると、先祖クラスは任意の子孫クラスに置き換えられるはずですよね? 更新。 私はすでに答えを受け入れましたが、質問を説明するためにRubyからもう1つの具体例を追加したいと思います。Rubyでは、クラスはClassクラスの子孫であるという意味で、各クラスはモジュールですModule。しかしながら: class C; end C.is_a?(Module) # => true C.class # => Class Class.superclass # => Module module M; end M.class # => …

2
Liskovの置換の原則:サブタイプに、型には存在しない追加の動作が実装されている場合、このLSPの違反ですか?
私はより良く、よりクリーンなコードを書くために、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に違反せずにクラスを拡張するにはどうすればよいでしょうか。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.