Laden...

List<> Generic in Basisklasse

Erstellt von jkrt vor 3 Jahren Letzter Beitrag vor 3 Jahren 432 Views
J
jkrt Themenstarter:in
2 Beiträge seit 2021
vor 3 Jahren
List<> Generic in Basisklasse

Hallo,

ich habe folgendes Problem.

EIne Basisklasse in der eine Liste deklariert ist:


class BaseClass
{
  public List<MeasurementData> DataChannel { get; protected set: }
}

Abgeleitete Klassen, ein Beispiel:


class DerivedClass1 : BaseClass
{
  //Im Konstruktor erfolgt die Instanziierung der Liste
   public DerivedClass1()
   {
      DataChannel = new List<MeasurementData>();
   }
   
  //Liste wird über einen Eventhandler befüllt wenn ein UDP Socket neue Daten erhält
   private void NewDataArrived(object sender, MeasuremetData e) 
   {

      DataChannel.Add(e);
   }

}

Aber: in jeder abgeleitetn Klasse kann der Datentyp der Liste (im Beispiel immer "MeasurementData") unterschiedlich sein. Konkret sind das immer Messdaten die von einem Gerät über UDP gesendet werden, die jedoch einen unterschiedlichen Aufbau haben können)

In der Basisklasse sind noch virtuelle Methoden definiert die in den abgeleiteten Klassen unterschiedlich sein können, das funktioniert auch.

An anderer Stelle verwende ich dann die Klasse:


BaseClass MeinObjekt;

switch (version)
{
  case 1: MeinObjekt = new DerivedClass1();
      break;
  case 2: MeinObjekt = new DerivedClass2();
      break;
}

double xy = MeinObjekt.DataChannel.data1;


Mein Problem ist nun: was muss ich tun, dass der Datentyp der Liste flexibel ist? Irgendwie muss das doch mit Generics funktionieren? Aber wie?

16.842 Beiträge seit 2008
vor 3 Jahren

Kannst Du mal den konkreten Fall erklären?
Für mich hört sich es fast so an, dass Du schon vor dieser Sache hier in Richtung Designfehler bist, zumindest wenn ich das switch so sehe... aber ohne das zu verstehen, kann ichs nicht berurteilen.

Dein Problem löst Du damit, dass Du der Basisklasse den Typ der Liste mitgibst.


class BaseClass<T>
{
  public List<T> DataChannel { get; protected set: }
}

class DerivedClass1 : BaseClass<MeasurementData>
{

Siehe dazu Generics – C#-Programmierhandbuch

J
jkrt Themenstarter:in
2 Beiträge seit 2021
vor 3 Jahren

Danke erstmal.

Zuerst nochmal genauer um was es geht.

Ich lese von einem Gerät Messdaten die über UDP an den PC gesendet werden. Das sind neben den eigentlich Messdaten auch Dinge wie z.B. ein Gerätestatuswort, einen Timestamp ...
Das was da in MeasurementData enthalten ist, kann sich je nach Softwareversion des Gerätes unterscheiden.

Das heisst: ich lese die Softwareversion des Gerätes und muss dann abhängig von dieser die Daten empfangen und verarbeiten.

Zu Deinem Lösungsvorschlag:
ich bekomme nun einen Fehler bei der Deklaration:


BaseClass MeinObjekt;

==> Die Verwendung von Typ "BaseClass<T>" (generisch) erfordert 1-Typargumente.

Ok, ist noch logisch dass da nun etwas fehlt. wenn ich schreibe


BaseClass<MeasurementData> MeinObjekt;

Funktioniert die Deklaration, läuft auch, aber jetzt bin ich doch wieder an den einen Datentyp "MeasuerementData" gebunden?

16.842 Beiträge seit 2008
vor 3 Jahren

Mit dem Code von mir schreibst Du einfach


DerivedClass1 myObject = new DerivedClass1();

Basisklassen designt man ja normalerweise so, dass man sie eben nicht instantiiert, sondern die Ableitungen.

Aber irgendwo musst Du den Typ angeben.
Es ist nicht möglich, dass C# das über Hellseher-Fähigkeiten umsetzt.

Willst Du eine Liste flexibler halten, dann musst Du mit einem Basisinterface der Listen-Implementierung arbeiten; also ganz einfache Objekt-orientierte Programmierung.
Generics sind jedoch grob gesagt Compiler-Hilfen; ergo muss zur Compilezeit feststehen.

6.911 Beiträge seit 2009
vor 3 Jahren

Hallo jkrt,

ich lese die Softwareversion des Gerätes und muss dann abhängig von dieser die Daten empfangen und verarbeiten.

um ein paar Entwurfsmuster die da angewandt werden können zu nennen und um dir ein schönes Wochenende zu bereiten 😉* Strategie

Damit kannst du die Unterscheidung durchführen und dann mit der konkreten Instanz die Daten lesen / halten.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"