2016-09-12 9 views
0

GoFには、ビルダーの実装に関する問題の一部があります。それらのうちの1人は言う:GoFビルダーとLiskovの置換原則

空のメソッドは、ビルダーではデフォルトです。 C++では、ビルドメソッドは で、意図的に純粋仮想メンバ関数として宣言されていません。彼らは は、クライアントは、彼らが興味を持っているだけ 操作を上書きせ、代わりに空のメソッドとして定義されている。

はない空のメソッドは、LSPに違反していますか? OstrichBirdから継承すると同様に見えますが、それはflyになります。

答えて

0

LSPは、少なくとも同じことをしないで親メソッドをオーバーライドすることはできず、メソッドの目的と矛盾しない特別な動作を行うことができないと述べています。

これは、親メソッドを最初に呼び出してから、余分な処理を実行することによって実現されることがよくあります。

親メソッドは何もしません。それを上書きすることは原則に違反しません(メソッド名が "add"と呼ばれる場合は "substract"のような操作を実行しないでください)。

今後の実装では、親が何もしないことを保証する必要があります。だから(fly()メソッドを持っていBirdクラスからOstrichを作成する)

+0

したがって、 'Bird'は' fly'と呼ばれる空のメソッドを持つことができ、 'Straus'は鳥である可能性がありますか? – Narek

+0

でも、フライは何もしないので、それは本当に飛んでいない鳥です。おそらくダチョウ? –

+0

@ Narekあなたは意図を明確にしなければなりません。あなたも 'canFly'メソッドを持っていれば、すべてがうまくいっていると言えます。また、インタフェースを分離し、別々の 'FlyingBird'インタフェースを持たせることもできます。そうすれば、すべての鳥を均一に扱うことはできません。 – plalx

0

あなたの例...念のために親の空のメソッドを呼び出し、確かに間違いなくLSPを違反した例です。

しかし、この場合、その例をとることは公正ではありません。あなたは明確にあなたが

を言うように表示されている場合彼らは、クライアントがに興味 操作のみを上書きできるようにし、代わりに空のメソッドとして定義されています。この場合はそう

は1があるため、fly()方法があり、Ostrichは、それが害をしないだろう、それを上書きするつもりはないBirdクラスのうち、Ostrichクラスを作成しようとしている場合そこにはパワーはありませんが。

しかし、技術的には問題ありませんが、概念的にはそういうものはありません。実際にパターンに問題はありませんが、実装の制限はさまざまな言語で直面しています。

0

ダチョウは飛行することができますが飛行することができます。ですからBirdインターフェイスのflyメソッドの名前をactionのように変更することをお勧めします。 Eagleの実装は「飛行」し、Ostrichの実装は「実行中」になります。

関連する問題