[.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> の方が速いんだよね? »
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
「-プログラミング ( わんくま )」カテゴリの記事
- [わんくま名古屋] 第21回: Metro サンプルコード解説 (1/3)(2012.04.15)
- [わんくま名古屋] 第21回は 4月 14日 - Windows 8 Metro をやるよ~♪(2012.04.12)
- [わんくま東京] 第59回の資料を公開しました(2011.06.02)
- [わんくま東京] 第59回は 5月 28日 - 名古屋から侵略します♪(2011.05.23)
- [わんくま名古屋] 第17回は 4月 9日 - TDD ネタで喋ります(2011.04.03)
この記事へのコメントは終了しました。
コメント
> Generic の List を継承してはいけない。
> …なんて、 誰が言いだしたんだろう?
この間、「C# ルールブック」という本を立ち読みしていたら、そこに書いてましたよ。
僕も
> class Tree : List
みたいに継承していましたので、その本を読んで
「えっ?!ダメなの??」って衝撃を受けました( ; ゚Д゚)
理由を書いてましたが、うろ覚えですが、
確か、拡張性とパフォーマンスのことをいってました。
> List はパフォーマンスを上げるために拡張性を犠牲にしてるから・・・
と
> 「System.Collections.Generic.List
が、皆さんの予想ですでに出てますが、このことを確か言っていました。
ごめんなさい。うろ覚えですがそのようなことを理由として本に書いてました。
ただ...こちらのブログにあるようにパフォーマンスに違いが出るなら、かつ拡張する必要がないなら、Listを継承して適材適所で使っていこうと思ってます。
投稿: あくあれっど | 2013年4月28日 (日) 23時24分
>virtualにしない事でどれだけパフォーマンスは上がるんだろう?
>そんなに変わるものなんでしょうかね?
相当積み重ねないと、目には見えてこないでしょうねぇ…
投稿: 渋木宏明(ひどり) | 2009年4月17日 (金) 10時27分
>List はパフォーマンスを上げるために拡張性を犠牲にしてるから・・・
virtualにしない事でどれだけパフォーマンスは上がるんだろう?
そんなに変わるものなんでしょうかね?
# すみません
# 間違って過去記事の方にコメントしてしまったので、こちらにも同じ内容で投稿します
投稿: BlackB | 2009年4月17日 (金) 09時40分
List<T> とかは、(ヘルプトピックにも書いてありますが)Add, Remove 時などに呼び出される気の利いた override メソッドを持っておらず、発展的に利用しようと思うとすぐにドン詰まるってだけの話で、別名を付ける程度の用途であれば継承しても特に問題はないはずなんですよね。
あれこれ小細工をひねり出する前に「何故だめ(と言う人がいる?)なのか」を調べなくっちゃね、てことで。
投稿: 渋木宏明(ひどり) | 2009年4月17日 (金) 04時08分
んー、Listの継承といえば
class Tree : List
とかでよくやってるけど…
投稿: 菊池 | 2009年4月16日 (木) 19時34分