« [.NET] できる開発者は知っている! 使って覚える Visual Studio 2008 ~ 単体テスト | トップページ | [.NET] そういうからには、 Collection<T> より List<T> の方が速いんだよね? »

2009年4月16日 (木)

[.NET] Generic の List を継承してはいけない。 …なんて、 誰が言いだしたんだろう?

倉田 有大のblog より。

List()を継承してはいけない。・・ならば・・
投稿日 : 2009年4月16日 14:50

委譲すればいいんでないかい?

たしかに、 委譲で作った方が後々良いことがあるかと思うです。 アプリケーションのフレームワーク部分などのように、 拡張性を考えておかないといけないところでは、 委譲でやるほうがお勧めです。

ただ、 FxCop が怒って来る CA1002 というのは、 「公開してはいけない」 すなわち public なメンバにするな、 ということです。 継承しちゃいけない、 じゃないです。
# 倉田さんのところのコメントに載せたお試しコードも、 CA1002 とかのお叱りは喰らってないです。 f(^^;
## 怒られてない、 ってだけで。 親のメソッドを隠蔽するのは、 まずい設計の匂いがぷんぷんしますけどね
w

てことで。
継承しちゃいけない って、 誰が言いだしたんでしょう?

|

« [.NET] できる開発者は知っている! 使って覚える Visual Studio 2008 ~ 単体テスト | トップページ | [.NET] そういうからには、 Collection<T> より List<T> の方が速いんだよね? »

プログラミング」カテゴリの記事

-プログラミング ( わんくま )」カテゴリの記事

コメント

んー、Listの継承といえば

class Tree : List

とかでよくやってるけど…

投稿: 菊池 | 2009年4月16日 (木) 19時34分

List<T> とかは、(ヘルプトピックにも書いてありますが)Add, Remove 時などに呼び出される気の利いた override メソッドを持っておらず、発展的に利用しようと思うとすぐにドン詰まるってだけの話で、別名を付ける程度の用途であれば継承しても特に問題はないはずなんですよね。

あれこれ小細工をひねり出する前に「何故だめ(と言う人がいる?)なのか」を調べなくっちゃね、てことで。

投稿: 渋木宏明(ひどり) | 2009年4月17日 (金) 04時08分

>List はパフォーマンスを上げるために拡張性を犠牲にしてるから・・・

virtualにしない事でどれだけパフォーマンスは上がるんだろう?
そんなに変わるものなんでしょうかね?

# すみません
# 間違って過去記事の方にコメントしてしまったので、こちらにも同じ内容で投稿します

投稿: BlackB | 2009年4月17日 (金) 09時40分

>virtualにしない事でどれだけパフォーマンスは上がるんだろう?
>そんなに変わるものなんでしょうかね?

相当積み重ねないと、目には見えてこないでしょうねぇ…

投稿: 渋木宏明(ひどり) | 2009年4月17日 (金) 10時27分

> Generic の List を継承してはいけない。
> …なんて、 誰が言いだしたんだろう?

この間、「C# ルールブック」という本を立ち読みしていたら、そこに書いてましたよ。
僕も
> class Tree : List
みたいに継承していましたので、その本を読んで
「えっ?!ダメなの??」って衝撃を受けました( ; ゚Д゚)


理由を書いてましたが、うろ覚えですが、
確か、拡張性とパフォーマンスのことをいってました。
> List はパフォーマンスを上げるために拡張性を犠牲にしてるから・・・

> 「System.Collections.Generic.List は継承ではなくパフォーマンスを目的としたジェネリック コレクションである」
が、皆さんの予想ですでに出てますが、このことを確か言っていました。

ごめんなさい。うろ覚えですがそのようなことを理由として本に書いてました。
ただ...こちらのブログにあるようにパフォーマンスに違いが出るなら、かつ拡張する必要がないなら、Listを継承して適材適所で使っていこうと思ってます。

投稿: あくあれっど | 2013年4月28日 (日) 23時24分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/209349/44689576

この記事へのトラックバック一覧です: [.NET] Generic の List を継承してはいけない。 …なんて、 誰が言いだしたんだろう?:

» [.NET] そういうからには、 Collection [biac の それさえもおそらくは幸せな日々@nifty]
[.NET] Generic の List を継承してはいけない。 …なんて、 誰が言いだしたんだろう? …の続き。 菊池さん んー、Listの継承といえばclass Tree : Listとかでよくやってるけど… やっぱり、 そうですよね。 ちょっとした補助メソッドを追加したりするために、 あるいは、 それこそ型を固... [続きを読む]

受信: 2009年4月17日 (金) 20時03分

« [.NET] できる開発者は知っている! 使って覚える Visual Studio 2008 ~ 単体テスト | トップページ | [.NET] そういうからには、 Collection<T> より List<T> の方が速いんだよね? »