2016-10-03 3 views
0

Ich habe eine Verpflichtung verschiedene Arten von Objekten hinzufügen speichern kann (auch wenn sie unterschiedlich sind, sie die gleiche Basisklasse teilen, sie Geschwister sind.Wie ich verschiedene Arten von Objekten in einer generischen Liste in C#

Betrachten diese Klassenhierarchie

public abstract class Fruit 
{ 
    public int Quality { get; set; } 

    public string Name { get; set; } 

} 

public sealed class Apple :Fruit 
{ 
    public string Color { get; set; } 

    public Apple(string color ="Red") 
    { 
     Color = color; 
    } 
} 

public sealed class Orange : Fruit 
{ 
    public Orange(string type = "WithSeed") 
    { 
     Type = type; 
    } 
    public string Type { get; set; } 
} 

Wie kann ich so etwas wie dieses

_apples = new List<Apple> 
     { 
      new Apple 
      { 
       Name = "Fiji Apple", 
       Quality = 9, 
       Color ="Green" 
      }, 
      new **Orange** 
      { 
       Name = "Indi Orange", 
       Quality = 7, 
      } 
     }; 

der Verbraucher dieser generischen Liste, um es mit der Basisklasse verwenden. Zum Beispiel:mit. Kann jemand bitte vorschlagen?

Antwort

2

Haben Sie eine Liste von Fruit. Auf diese Weise enthält die Liste jedes Fruit Objekt sowie jedes Objekt eines Typs, der von Fruit erbt.

+0

Kann es ohne Verwendung der Basisklasse erfolgen. Ich meine einige, wie, auch wenn verschiedene Arten von Objekten (Apfel, Orange, Ananas usw.) übergeben werden, um dieses Array vorzubereiten, sollten sie als Äpfel projiziert werden. – ViBi

+0

Ich weiß nicht, was "projiziert" in diesem Zusammenhang bedeutet. Möchtest du, dass die Software einen Apple aufbaut, basierend auf dem, was du über Orange erzählst? Eine Orange hat keine Farbeigenschaft, also wie um alles in der Welt könnte sie das tun? Du kannst Äpfel und Orangen nicht mischen;) –

+0

Wie würdest du eine Orange als "Apfel" "projizieren"? Ein 'Apple' hat eine Menge Sachen, die ein' Orange' nicht hat und umgekehrt. Sie müssten ein neues "Apple" -Objekt erstellen, das so viel wie möglich mit dem ursprünglichen "Orange" -Objekt teilt, aber dann verlieren Sie den Verweis auf das ursprüngliche Objekt sowie alle "Orange" -spezifischen Informationen. – Abion47

1

Eine Liste muss immer wissen, welchen Typ sie enthält. Damit es sowohl Apple als auch Orange enthält, müssen Sie die Liste so definieren, dass sie eine Superklasse oder Schnittstelle enthält, die alle Elemente abdeckt, die Sie in die Liste einfügen möchten.

In diesem Fall würde das List<Fruit> oder List<object> möglich machen, beides zu enthalten.

+1

Sie haben Recht, dass die Liste selbst nichts über die Elemente wissen muss, die sie enthält, es ist schließlich nur eine Liste von Zeigern oder Strukturen intern, weshalb "Objekt" gut genug ist. Der Compiler muss jedoch wissen, dass er in die Liste eingefügte Prüfelemente eingeben kann. – Cine

0

Es ist ein häufiger Fehler, Klassenhierarchien für diesen Zweck zu verwenden. Haben Sie eine Schnittstelle und erstellen Sie stattdessen eine Liste für diese Schnittstelle, dann können Sie sogar Objekte speichern, die nicht zu dieser Klassenhierarchie gehören.

Immer wenn Sie ein Objekt eines anderen Typs speichern müssen, implementieren Sie einfach die Schnittstelle in diesem Typ, so dass Sie keine Änderungen an Ihrem Speicherlistencode vornehmen müssen.

0

Da alle Objekte aus Obst erben würde ausreichen, um den List von Fruit

List<Fruit>_apples = new List<Fruit>{...} 

wenn ich eine Klasse hatte zu schaffen, die vordefiniert ist not extend Fruit hätte eine List of objects als alle Arten (Werttypen und Verweis erstellen und benutzerdefiniert) werden direkt oder indirekt von Object übernommen.

List<Object>_apples = new List<Object>{...} 

Beachten Sie, dass, wenn Sie erweitern nicht Frucht kann nicht ihre Attribute zugreifen wie quality und color

0

Verwenden Sie diesen Code verschiedene Objekte in einer Liste

List<Fruit> fruits = new List<Fruit>(); 
      fruits.Add(new Apple("Red")); 
      fruits.Add(new Orange("Withseed")); 
0

Ich glaube hinzufügen was Sie versuchen, ist eine Liste von verschiedenen Arten von Fruit zu verwenden, nur um sie zu speichern oder sie in einem List weiterzugeben, anstatt separatezu benötigen, List<Orange> usw. Aber Sie müssen immer noch die typspezifischen Daten verwenden (wie Apple.Color und Orange.Type).

Um dies zu demonstrieren, habe ich eine FruitBasket Klasse erstellt, um alle Ihre verschiedenen Fruit Objekte und Project() mit ihren einzigartigen Eigenschaften zu speichern.

public class FruitBasket 
{ 
    public List<Fruit> FruitList { get; } 

    public FruitBasket(List<Fruit> fruitList) 
    { 
     FruitList = fruitList; 
    } 

    public List<string> Project() 
    { 
     var result = new List<string>(); 
     foreach (var fruit in FruitList) 
     { 
      if (fruit is Apple) 
      { 
       var apple = (Apple) fruit; 
       result.Add("This is a " + apple.Color + " " + apple.Name); 
      } 
      else if (fruit is Orange) 
      { 
       var orange = (Orange) fruit; 
       result.Add("A " + orange.Name + " with type: " + orange.Type); 
      } 
      else 
      { 
       result.Add("An unknown " + fruit.Name); 
      } 
     } 
     return result; 
    } 
} 

Während durch die verschiedene Fruit Objekte Looping, ist es die Art der Frucht Überprüfung und eine eindeutige Zeichenfolge in einer Liste setzen.

Die Verwendung dieses Beispiel wäre:

var result = new FruitBasket(new List<Fruit> 
{ 
    new Apple 
    { 
     Name = "Fiji Apple", 
     Quality = 9, 
     Color = "Green" 
    }, 
    new Orange 
    { 
     Name = "Indi Orange", 
     Quality = 7, 
    } 
}).Project(); 

Und die result sein:

Dies ist eine grüne Fiji Apple-

A Indi-Orange mit Typ: WithSeed

Verwandte Themen