2011-01-19 18 views
5

Sto cercando un aiuto struttura di classe. Diciamo che ho una classe chiamata Cane detiene informazioni sul cane (nome, peso, tipo) ma perché potrebbero esserci più cani, vorrei anche una classe per tenere tutti questi cani, da utilizzare durante l'intero mio progetto. Qual'è il modo migliore per farlo?Struttura della classe per un elenco Classe?

Solo per avere una classe DogList, che memorizza le informazioni sulla classe Dog in un elenco pubblico? Permettendomi di recuperarlo a piacimento?

O l'elenco deve essere statico all'interno della classe cane originale? forse nel costruttore, ogni volta che qualcuno crea un nuovo cane, il cane viene inserito nell'elenco statico?

Modifica: mi dispiace un po 'mancare leader Ecco la struttura che ho finora, chiedendo se c'è un modo migliore per implementare.

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

quando dici "potrebbero esserci più cani" intendi "più istanze di cani di classe" o "più tipi di cani"? – yasouser

+0

scusa, più istanze di cane di classe – Spooks

risposta

5

Il modo più semplice per fare una lista di cani è:

List<Dog>

Questa è una lista fortemente tipizzato di cani che utilizzano la classe List<T> da System.Collections.Generic. Si può fare una classe di questo:

public class DogList : List<Dog>

Anche se questo non è di solito necessario a meno che non si desidera aggiungere le proprietà specificamente a una lista dei cani e non i cani stessi.

UPDATE:

Di solito non è necessario creare una classe lista dedicato quando si utilizza List<T>. Nella maggior parte dei casi, si può fare questo:

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' 
    } 
} 

Se stai usando LINQ per ottenere i dati, è possibile utilizzare l'estensione ToList() per restituire un List<T>, quindi nessun bisogno di creare una classe che deriva da List<T>.

+0

So come creare un elenco di cani, non so proprio dove farlo, in modo che sia accessibile per qualsiasi classe nel progetto. Avrò bisogno di un metodo per impostare la lista, se questa è nella sua classe o all'interno della classe di cani – Spooks

+1

Gli elenchi generici sono convenienti perché non è necessario dichiararli in ogni luogo. Nei miei progetti, quando ho bisogno di un elenco di qualcosa (fatture, utenti, qualsiasi cosa) espongo una proprietà o un metodo di List dove T è il tipo che voglio restituire. Se si dispone di un servizio che restituisce un elenco di cani, rendere il metodo restituire l'elenco . Se si dispone di un ViewModel che supporta una vista con una listbox o una griglia piena di cani, creare una proprietà o digitare l'elenco e associare il controllo a tale proprietà. –

+1

PS- L'unico requisito qui è che il tuo progetto abbia un riferimento al tipo 'T', qualunque sia il tipo che vuoi inserire in un elenco. È quindi possibile utilizzare elenchi generici per incapsulare quel tipo e si ottiene tutta la funzionalità che viene fornito con l'elenco (Aggiungi, Inserisci, Rimuovi, ecc.) –

3

Bene, C# ha già una classe List<> perfettamente buona, quindi a meno che non si abbiano esigenze molto specifiche non andrei con una nuova classe DogList. Se hai bisogno di tenere traccia di tutti i cani creati, allora una lista statica all'interno della classe cane va bene. Assicurati che sia mantenuto private e che tu abbia metodi per aggiungere o recuperare cani. Meglio ancora, la tua fabbrica di cani può aggiungerli alla lista per te (che ora ti vedo nominare tu stesso).

+0

Fabbrica di cani? significa una classe al di fuori della classe del cane? – Spooks

+0

Non necessariamente, può essere un metodo statico della classe Dog. – Tesserex

1

Oppure l'elenco deve essere statico entro classe cane originale? forse nel costruttore , ogni volta che qualcuno crea un nuovo cane, il cane viene inserito nell'elenco statico statico?

Questa soluzione funzionerebbe in un'applicazione a thread singolo, ma potrebbe esporvi a all the dangers of global variables.

Sarebbe anche un povero astrazione *: quando avrebbe senso per una classe Dog contiene un elenco di tutti i cani qualsiasi chiamante ha costruito a tempo di esecuzione? Cosa dovrebbe succedere se il chiamante disalloca un'istanza Dog?

Invece, i chiamanti che utilizzeranno un elenco di cani dovrebbero assumersi esplicitamente la responsabilità di crearlo e gestirlo. Questi chiamanti conosceranno la durata corretta per la lista, saranno in grado di controllare ciò che viene inserito nella lista, inoltre sarà ovvio a chiunque legga il codice che cosa sta succedendo e in che modo.

* A meno che l'elenco non sia un registro di cani creati.

+0

Eccellente, molto bene detto. Non pensavo che avesse senso. È possibile visualizzare il modo in cui l'ho finalmente fatto sopra (ovviamente non usare effettivamente i cani, e semplificato un po ') – Spooks

Problemi correlati