77

私は通常、オブジェクトインスタンスがリスコフの置換原則に準拠していることを確認しようとしますが、LSPはコンストラクターにも適用されるべきだと人々は考えているのでしょうか?

私はこれをグーグルで試しましたが、どちらにしても強い意見を見つけることができませんでした。

私のコーディングのほとんどはRubyで行われていることに注意する必要がありますが、サブクラスのコンストラクターが親クラスとわずかに異なる場合があります。それらは同じ基本セットの引数を取り、多くの場合余分な引数を取ります。これは、他のクラスメソッドでも発生する場合があります。

私の頭の後ろでは、これは常にLSP違反のように感じていましたが、他の誰かもこのように感じているかどうかを確認したいと思いました。

4

3 に答える 3

84

いいえ、コンストラクターを使用すると、サブタイプを処理していることがわかります。これにより、他のパラメーターなど、親コンストラクターに必要のない前提条件を設定できます。これが、ほとんどの言語でコンストラクター名が作成されるクラスの名前である理由です。

これがどのようにの良い例であるかというと、aColoredSquareはの適切なサブタイプである可能性がありますSquareが、追加のパラメーターが必要ですcolor。このようなことを行うことができなかった場合、サブタイプの有用性ははるかに低くなります。

ある意味では、コンストラクターは実際には型の一部ではありません。コンストラクターは、その型の要素を返す関数です。したがって、サブタイプの新しいコンストラクターを定義しても、LSPは壊れません。

于 2011-03-30T19:00:18.387 に答える
16

絶対にありません。

コンストラクターは通常、サブタイプに特化しています。LSPをコンストラクターに適用しようとすると、サブタイプに特定のメソッドやメンバーを追加することはできないと言っているようなものになります。しかし、制限はその逆にすぎません。

また、Philipにも同意します。コンストラクターは実際には型の一部ではありません(一部の言語では、コンストラクターの代わりに他のファクトリを簡単に使用できます)。smalltalkの用語を使用すると、コンストラクターはメタクラスのメソッドであると言えます。

ここではLSPに違反していません。これはインスタンスメソッドにのみ適用され、クラスメソッド(コンストラクターまたはその他のクラスメソッド)には適用されません。

于 2011-03-30T20:05:52.163 に答える
1

これは一種の意見のある質問ですが、私が私の書き方をする傾向があるのは、追加のパラメーターが機能の変更に実際には関係がないということです。つまり、コンストラクターがサブクラスに追加のパラメーターを必要とする場合、標準機能を維持することです(ただし、基本的な機能は異なります)。このようにして、ClassA = new ClassB(いくつかの引数を使用)を作成します。そうすれば、これを実行しても、ClassA = new ClassA()を実行しても、機能は同じです。そして、私は通常、ある種のファクトリメソッドを使用してそれらを作成し、それらがどのように機能するかをシームレスにします。繰り返しますが、これは私が物事を行う方法であり、決して物事を行うための絶対的な正しい方法ではありません。

于 2011-03-30T19:00:03.977 に答える