私のプログラムを計画するとき、私はしばしば次のような一連の思考から始めます。
サッカーチームは、サッカー選手のリストにすぎません。したがって、私はそれを次のように表現する必要があります:
var football_team = new List<FootballPlayer>();
このリストの順序は、プレーヤーが名簿にリストされている順序を表しています。
しかし、後でチームが記録する必要があるのは、単なるプレーヤーのリストに加えて、他のプロパティもあることに気づきました。たとえば、今シーズンのスコアの累計、現在の予算、均一な色、string
チームの名前を表すなど。
だから私は思う:
さて、サッカーチームは選手のリストのようなものですが、それに加えて、名前(a
string
)と現在の合計スコア(anint
)があります。.NETはサッカーチームを格納するためのクラスを提供していないため、自分でクラスを作成します。最も類似し、関連する既存の構造はList<FootballPlayer>
なので、それを継承します。class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
しかし、ガイドラインでは、から継承してはならないList<T>
ことがわかっています。このガイドラインは2つの点で完全に混乱しています。
何故なの?
どうやらList
、何らかの形でパフォーマンスが最適化されています。どうして?拡張すると、どのようなパフォーマンスの問題が発生しList
ますか?正確には何が壊れますか?
私が見たもう1つの理由List
は、Microsoftから提供されたものであり、私はそれを制御できないため、「パブリックAPI」を公開した後で後で変更することはできません。しかし、私はこれを理解するのに苦労しています。パブリックAPIとは何ですか。なぜ気にする必要があるのですか。現在のプロジェクトにこのパブリックAPIが含まれていない可能性がある場合、このガイドラインを無視しても安全ですか?私は、継承を行う場合List
と、、それは私が公共のAPIを必要と判明し、どのような困難私が持っているのだろうか?
なぜそれが重要なのですか?リストはリストです。何が変わる可能性がありますか?何を変更したいですか?
そして最後に、Microsoftがからの継承を望まないのであればList
、なぜ彼らはクラスを作らなかったのでしょうか。sealed
ですか?
他に何を使うべきですか?
どうやら、カスタムコレクションの場合、Microsoft Collection
はの代わりに拡張する必要のあるクラスを提供していList
ます。しかし、このクラスは非常に裸であり、たとえばなどAddRange
、多くの有用なものはありません。jvitor83の答えは、その特定のメソッドのパフォーマンスの根拠を提供しますが、遅いのAddRange
は遅いよりも良いですAddRange
どうしてですか
からのCollection
継承はList
、からの継承よりもはるかに多くの作業であり、私には利点がないと思います。確かにMicrosoftは理由もなく余分な作業をするように言わないので、何かを誤解しているように感じずにはいられず、継承Collection
は私の問題の正しい解決策ではありません。
実装などの提案を見てきました IList
。いいえ。これは何十行ものボイラープレートコードで、何も得られません。
最後に、List
何かを何かにラップすることを提案する人もいます:
class FootballTeam
{
public List<FootballPlayer> Players;
}
これには2つの問題があります。
それは私のコードを不必要に冗長にします。
my_team.Players.Count
ただ電話をする代わりに今すぐ電話しなければなりませんmy_team.Count
。ありがたいことに、C#を使用すると、インデックス作成を透過的にするようにインデクサーを定義し、内部のすべてのメソッドを転送できますList
...しかし、これは大量のコードです。すべての作業で何が得られますか?それだけでは意味がありません。サッカーチームは、選手のリストを「持っていません」。これは、ある選手のリスト。「John McFootballerがSomeTeamのプレーヤーに参加した」とは言わないでください。あなたは「ジョンがSomeTeamに参加した」と言います。「文字列の文字」に文字を追加するのではなく、文字列に文字を追加します。図書館の本に本を追加するのではなく、本を図書館に追加します。
「内部で」起こることは「XをYの内部リストに追加する」と言うことができることを私は理解していますが、これは世界について非常に直観に反する考え方のようです。
私の質問(要約)
、「論理的に」(「人間の心に」、と言うことであるが)だけで、データ構造、表現の正確なC#の方法は何であるlist
のthings
少数の添えものとは?
からの継承はList<T>
常に受け入れられませんか?それはいつ受け入れられますか?なぜ/なぜしないのですか?継承するかどうかを決定するとき、プログラマは何を考慮しなければなりませList<T>
んか?
string
すべて行うために必要とされてobject
行うことができ、よりを。