Autor Beitrag
sky21
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: 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?

ausblenden C#-Quelltext
1:
2:
3:
    public class MyBaseContainer
    {
        protected List<MyBaseObject> _list = null;

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Di 02.06.09 09:48 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 02.06.09 12:57 
Hallo Sky21,

du bringst irgendwie Generics und Polymorphie durcheinander...

Also entweder
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public class SellManager: TradeManager
{
        public SellManager() : base()
        {
            _list = new List<TradeObject>(); // <- hier mußt du den gleichen Datentyp wie in der Deklaration von 'list' angeben
        }
}


oder aber gleich nur mit Generics
ausblenden 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>();
        }
}