2011-01-19 23 views
5

私はいくつかのクラス構造のヘルプを探しています。私はDogと呼ばれるクラスを持っていると言うことができますが、犬(名前、体重、タイプ)についての情報を保持していますが、複数の犬がいる可能性があるため、私はプロジェクト全体を通して使用するためにこれらの犬をすべて保持するクラスも欲しいです。これをやり遂げる最善の方法は何ですか?リストのクラス構造クラス?

DogListクラスを持っているだけで、Dogクラスの情報が公開リストに格納されますか?意志で私にそれを引き出すことを許可するか?

リストは元の犬クラス内の静的である必要がありますか?おそらくコンストラクタで、誰かが新しい犬を作るたびに、犬は静的リストに入れられますか?

編集:申し訳ありません質問は少し先行していました これまで実装している方法があるかどうか疑問に思っています。

public class Dog 
{ 
    public string name{get;set;} 
    public int weight { get; set; } 
} 

public class DogFactory //not sure if thats the correct wording 
{ 
    public List<dog> lstDogs = new List<dog>(); 
    public void setDogs() 
    { 
    Animal.Retrieve("Dog"); 
    //will retrieve a list of all dogs, with details, though this is costly to use 
     foreach(Animal.Dog pet in Animal._Dogs) 
     { 
      Dog doggie = new doggie(); 
      doggie.Name = pet.Name; 
      ...etc 
      lstDog.add(doggie); 
     } 
    } 
} 
+3

「複数の犬がいる可能性がある」と言う場合、「犬のクラスの複数のインスタンス」または「複数のタイプの犬」を意味しますか? – yasouser

+0

申し訳ありませんが、犬クラスの複数のインスタンス – Spooks

答えて

5

犬のリストを作成する最も簡単な方法は次のとおりです。

List<Dog>

これはSystem.Collections.GenericからList<T>クラスを使用して犬の強く型付けされたリストです。あなたは、特に犬ではなく、犬自身のリストにプロパティを追加する場合を除き、これは通常は必要ありませんが

public class DogList : List<Dog>

:あなたはこのクラスを作ることができます。

UPDATE:

あなたは通常List<T>を使用した場合、専用のリストクラスを作成する必要はありません。

public class DogService 
{ 
    public List<Dog> GetAllDogs() 
    { 
     var r = new Repository(); // Your data repository 
     return r.Dogs.ToList(); // assuming your repository exposes a 'Dogs query' 
    } 
} 

、あなたのデータを取得するためにLINQを使用している場合、あなたはList<T>を返すようにToListメソッド()拡張機能を使用しないので、から派生したクラスを作成する必要ができます。ほとんどの場合、あなたはこれを行うことができますList<T>

+0

私は犬のリストを作る方法を知っています。私は犬のリストを作る方法を知っています。リストを設定するメソッドが必要です。これは、独自のクラスまたは犬クラス内にある必要があります。 – Spooks

+1

ジェネリックリストは、その場所全体に宣言する必要がないので便利です。私のプロジェクトでは、何か(請求書、ユーザー、何でも)のリストが必要なときリストのプロパティまたはメソッドを公開しますここでTは返すタイプです。犬のリストを返すサービスがある場合は、リストを返します。犬のリストボックスまたはグリッドでビューをサポートするViewModelがある場合は、プロパティを作成するか、List と入力してコントロールをそのプロパティにバインドします。 –

+1

PS-ここでの唯一の要件は、プロジェクトに「T」タイプへの参照があることです。その後、汎用リストを使用してそのタイプをカプセル化し、リスト(追加、挿入、削除など)に付属するすべての機能を利用できます。 –

3

まあ、C#はすでに完全に良いクラスを持っています。あなたが非常に具体的なニーズを持っていない限り、私は新しいDogListクラスには行きません。作成されたすべてのDogを追跡する必要がある場合は、dogクラス内の静的リストは問題ありません。それがprivateに保たれていることを確認して、犬を追加または取得する方法があります。あなたの犬の工場はあなたのためにリストに追加することができます。

+0

犬工場?それは犬クラスの外のクラスを意味しますか? – Spooks

+0

必ずしも、Dogクラスの静的メソッドである必要はありません。 – Tesserex

1

また、元の犬のクラス 内のリストを静的にする必要がありますか?おそらく コンストラクタで、誰かが 新しい犬を作成すると、その犬は 静的リストに入れられますか?

この解決策はシングルスレッドアプリケーションでは機能しますが、all the dangers of global variablesに公開されます。

*Dogクラスには、呼び出し元が実行時に構築したすべての犬のリストが含まれていると、意味がありますか?呼び出し元がDogインスタンスの割り当てを解除するとどうなるでしょうか?

代わりに、犬のリストを使用する発信者は、犬のリストを作成し管理することを明示的に行う必要があります。これらの発信者はリストの適切なライフタイムを知り、リストに含まれるものを制御できるようになります。また、コードを読んでいる人には、何が起こっているのか、どのように分かりますか。

*リストが作成された犬のログでなければならない限り。

+0

優れた、非常によく言った。私はそれが理にかなったとは思わなかった。あなたは私が最終的にそれを上にした方法を見ることができます(明らかに実際に犬を使用しないで、それを少し簡素化しました) – Spooks