Entwickler-Ecke
Basistechnologien - Polymorphie bei listen - was mache ich falsch?
sky21 - So 31.05.09 23:43
Titel: Polymorphie bei listen - was mache ich falsch?
Hi all
Ich möchte die Polymorphie bei Listen anwenden, habe aber so meine Probleme damit. Was mache ich falsch?
C#-Quelltext
1: 2: 3:
| public class MyBaseContainer { protected List<MyBaseObject> _list = null; |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| public class MySubContainer: MyBaseContainer {
public MySubContainer() : base() { _list = new List<MySubObject>(); } |
Der Compiler meldet mir ständig den Fehler "Cannot implicitly convert type ..." aber damit komme ich nicht zurecht....
jaenicke - Mo 01.06.09 02:41
Naja, die Liste ist nun einmal typisiert auf MyBaseObject. Und deshalb kannst du da nicht einfach eine Liste mit MySubObject zuweisen. Das muss dann explizit umgewandelt werden.
Ich vermute, dass du da ToList für den Basistyp MyBaseObject implementieren musst, keine Ahnung, ob es einfacher geht.
Kha - Mo 01.06.09 15:54
@sky21: Selbst wenn das ginge, was würde es dir bringen? Du erstellst eine List<MySubObject>, weist sie aber einzig und allein einer List<MyBaseObject>-Variablen zu, dann hättest du auch gleich eine List<MyBaseObject> erzeugen können. Mehr Input bitte über das, was du vorhast ;) .
jaenicke - Mo 01.06.09 15:59
Ich hatte vermutet, dass in der abgeleiteten Klasse eine solche Liste lokal benutzt werden soll und dann der Oberklasse zugewiesen werden soll um Casts zu verweiden (und das hier nur ein Beispiel war). Wenn dem nicht so ist, bringt das nichts, das stimmt.
sky21 - Di 02.06.09 09:48
Kha hat folgendes geschrieben : |
Mehr Input bitte über das, was du vorhast ;) . |
Also es geht um Folgendes: Ich möchte eine Applikation zum Kaufen und Verkaufen von Artikeln erstellen. Aufgrund vieler Gemeinsamkeiten soll ein Verkaufsarikel (SellObject) und Kauf-Artikel (BuyObject) von einer Basisklasse (TradeObject) erben. (von daher meine Generalisierung mit "MyBaseObject" und "MySubObject".
Die Anwendung bzw. die Verwaltung der Objekte soll in einer anderen Klasse mittels einer Liste erfolgen. Auch hier habe ich ein Konstrukt "TradeManager -> SellManager" bzw. "TradeManager -> BuyManager". Grund für diesen Aufbau: Allgemeine Verarbeitungen sollen in der Basisklasse TradeManager mit Zugriff auf die Basislistenelemente TradeObject erfolgen...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| public class TradeManager { protected List<TradeObject>_list = null;
}
public class SellManager: TradeManager {
public SellManager() : base() { _list = new List<SellObject>(); } public class BuyManager: TradeManager {
public BuyManager() : base() { _list = new List<BuyObject>(); } |
UGrohne - Di 02.06.09 11:59
Hier reicht es doch einfach aus, in der Basisklasse die Liste mit TradeObject-Elementen zu initialisieren, da brauchst Du nicht in den Ableitungen die Listendeklaration oder Initialisierung zu machen. Sonst kannst Du gleich alles in Deine abgeleiteten Klassen packen und die Elternklasse wegwerfen. Die Artikel werden ja in der Basisklasse komplett verwaltet, Du implementierst in den Ableitungen ja nur evtl. Änderungen im Verhalten, mehr nicht. Die Liste selbst kann aber trotzdem SellObjects und BuyObjects enthalten, auch wenn sie nur mit TradeObjects deklariert und initialisiert ist (Polymorphie sei Dank ;)).
Th69 - Di 02.06.09 12:57
Hallo Sky21,
du bringst irgendwie Generics und Polymorphie durcheinander...
Also entweder
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| public class SellManager: TradeManager { public SellManager() : base() { _list = new List<TradeObject>(); } } |
oder aber gleich nur mit Generics
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| public class TradeManager<T> where T : TradeObject { protected List<T>_list = null; }
public class SellManager: TradeManager<SellObject> { public SellManager() : base() { _list = new List<SellObject>(); } } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!