Autor |
Beitrag |
sky21
      
Beiträge: 141
W7
D2010, XE2
|
Verfasst: So 31.05.09 23:43
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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 141
W7
D2010, XE2
|
Verfasst: Di 02.06.09 09:48
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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>(); } } |
|
|