[過去ログ] C#, C♯, C#相談室 Part91 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
335: デフォルトの名無しさん [sage] 2016/08/27(土) 00:38:01.47 ID:gXVhUUHW(1/7) AAS
>>333333(2): デフォルトの名無しさん [] 2016/08/27(土) 00:18:55.08 ID:nVNQ8rj/(1) AAS
この場合は単純にGetAreaをabstract methodにして
各クラスでoverrideさせた方がよくないっすか?
その方がいいと思う理由は?
>>333にとって関数型よりオブジェクト指向の方が馴染みがあるからそう感じるだけじゃない?
どっちがいいかじゃなくて考え方が違うんだよ
346(2): デフォルトの名無しさん [sage] 2016/08/27(土) 09:56:58.93 ID:gXVhUUHW(2/7) AAS
型で分岐するのがどうして問題かというと、
後で型を追加したときに分岐の箇所を自分で探して条件を追加しなきゃいけなくなるから。
ちゃんとした関数型だと、パターンマッチで分岐させるような型って
type Shape = Rectangle(double x, double y, double w, double h)
| Circle(double x, double y, double r);
みたいな感じでクローズしておくんだよ。
これでShapeがとりうる全ての型をコンパイラが認識できるから、
Shapeに型を新たに追加したら>>329329(5): デフォルトの名無しさん [sage] 2016/08/26(金) 18:46:17.17 ID:zWe+Xnw2(2/3) AAS
>>328
本格的なパターンマッチングならこんなことができる
double GetArea(Shape shape) {
switch (shape) {
case Rectangle(x,y,w,h): return w * h;
case Circle(x,y,r): return PI * r * r;
}
}
さらに、変数にキャプチャするだけでなくxに具体的な値を指定すればxが特定の値の場合だけという条件指定も可能
今の貧弱な仕様だとお前の疑問の通りメリットはほとんどないのでまあ最終的には却下だろうな
がコンパイルエラーになってくれる。
イメージ的には 列挙体 + タプル に近いかな。OO言語の超強力なクラスとは全然異なるもの。
このように、パターンマッチは根が深いからにわか言語が中途半端に導入するとおかしなことになる。
358(2): デフォルトの名無しさん [sage] 2016/08/27(土) 22:01:19.98 ID:gXVhUUHW(3/7) AAS
>>357それは詭弁だな
拡張メソッドは単に型ごとにGetAreaをオーバーロードしてるだけだ
オブジェクト指向というよりはむしろ関数型的なやり方
型switchや仮想メソッドは実行時型に応じた動的な多相を実現する手段で、拡張メソッドで代替できるものではないよ
361(1): デフォルトの名無しさん [sage] 2016/08/27(土) 22:37:21.41 ID:gXVhUUHW(4/7) AAS
>>360?
普通にメソッドのオーバーライドによる多態のことだよ
364(3): デフォルトの名無しさん [sage] 2016/08/27(土) 23:01:52.80 ID:gXVhUUHW(5/7) AAS
>>362362(1): デフォルトの名無しさん [sage] 2016/08/27(土) 22:42:35.41 ID:vp5ltHnS(7/12) AAS
>>361
例えばJavaScriptでは動的に型を変更出来る。
だから実行時にswitchでやるのとコンパイル時に静的にリンクするのでは動作が異なってくる。
そういうのはC#にはないでしょ、って話。
だから話を戻すと、>>329のケースは通常のOOPの多態、
>>352のケースは拡張メソッドが一番良いと思う。
本家のも普通はOOPで対応する。
ただそれだと例にならないのでクエリがわざわざくっつけられているのだと思う。
最初の4行は俺にはよく意味がわからないけどそれはまあいいとして、
>>329で多態が必要なのに>>352352(6): デフォルトの名無しさん [sage] 2016/08/27(土) 19:54:25.56 ID:0MFbcQeG(1) AAS
相性が悪いんじゃなくて使い分けだと思う
上ででたShapeでは各クラスが面積を出すメソッドを持っててもべつにいいだろうけど
GUI側で図形の表示に使うメソッドをShapeに持たせるのはおかしい
その場合はどこか別で限定的にこのパターンマッチを使えばいいのではないか?
は拡張メソッドでいいというのは矛盾してるよ。
List<Shape>に入ってるものを全部Drawしたいとき、型ごとの拡張メソッドじゃ対応できないよ?
Shapeの外部にメソッドを定義しつつ多態相当の動作をさせたい、そのうえ明示的な型判定はダメというんなら、
引数をdynamicにキャストして強引に動的ディスパッチさせるみたいなことが必要。
368(1): デフォルトの名無しさん [sage] 2016/08/27(土) 23:18:51.07 ID:gXVhUUHW(6/7) AAS
>>366366(2): デフォルトの名無しさん [sage] 2016/08/27(土) 23:10:16.02 ID:vp5ltHnS(8/12) AAS
>>364
> List<Shape>に入ってるものを全部Drawしたいとき、型ごとの拡張メソッドじゃ対応できないよ?
出来るよ。というかそちららの認識が間違っていると思うが、
拡張メソッドはソース上では普通のメソッドと見た目は同じだよ。
ほんとに?
外部リンク:ideone.com
たまには自分の思い込みを疑ってみるのも大切だぞ
371(1): デフォルトの名無しさん [sage] 2016/08/27(土) 23:31:52.50 ID:gXVhUUHW(7/7) AAS
>>370だから俺は>>358からそう言ってるじゃん
拡張メソッドでは対応できないケースを示しただろ?
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.045s