@uskz それはその通りなのですが"LSP に違反しない"と言ってしまうと語弊があるかなーと。A を利用するプログラムで型を B に入れ替えてもそのプログラムは相変わらず正しい、という定義を満たさなくなるのでやっぱり LSP 違反になる気がします。
2010-05-31 03:10:08@uskz あー!失礼しました。先の僕のコードでは仰る通りでした。正しくはこっちです。http://ideone.com/J7awI
2010-05-31 03:16:24@PG_kura "A を利用するプログラムで型を B に入れ替えてもそのプログラムは相変わらず正しい、という定義"この定義がぼくの認識とずれが
2010-05-31 03:19:14@uskz class B が外部に func を公開していないのであれば訂正させて頂いたコードのようなプログラムで(言語は問わないですが)置換不可になるのでは?
2010-05-31 03:20:37@uskz 端的に言うと A を引数に取る関数に B のインスタンスを渡せるのだから B 側での private 指定は関係ない、ということを仰ってるのですよね?
2010-05-31 03:21:59@uskz で、それは A という型にのみ依存したコードであればそうなのですが、クラスの利用者が B にまで依存したコードを書いている場合も当然あるわけで、
2010-05-31 03:26:06@uskz そういうコードが B.func を private にすることで(クラス B が許さない処理をしようとして)不正になるのであれば違反が発生するので、そういう違反が発生しないような言語仕様になっているはずだろう、というのが @cknbstr さんの指摘だったのでは。
2010-05-31 03:28:47@PG_kura http://ideone.com/J7awI これは,ここからここまでの部分に現れるAを全てBに変えるということで良いですか?
2010-05-31 03:30:56@uskz で、7 行目がもし private にできるのであれば LSP 違反が発生し得る言語仕様になってしまうだろう、と。
2010-05-31 03:32:49@PG_kura うーん,でもLSPってOOPにおける多相性の正しい使い方に関する話ですよね?頭が混乱してるのですがさっき提示いただいたコードのはどうもLSPとは別問題に思えて
2010-05-31 03:38:13@PG_kura Liskovの最初の記述によると,"S型のオブジェクトo1の各々に対してT型のオブジェクトo2が1つ存在し,Tを使って定義されたプログラムPに対してo2の代わりにo1を使ってもPの振る舞いをが変わらない場合,SはTの派生型である"というのがLSPの定義
2010-05-31 03:41:35@uskz なるほどー。僕は原文参照してないので、僕の理解の方が怪しいのかも知れないですね。僕がさっき提示した wiki の説明は
2010-05-31 03:46:04@uskz "S が T の派生であれば"という書き方でしたが、"○○であれば S は T の派生型である"というのが原文なのであれば全く違うことを言っていたのかも知れません。
2010-05-31 03:47:05@PG_kura でもぼくが挙げたのは1987年のLsikovの最初のLSPに対する記述で,さっきのwikipediaのものはそれをLiskov(とJeannette Wing)が1994年に定式化したものなので,意味が違うとは思えないんですよね.
2010-05-31 03:56:22