Hallo
Ich suche nach einem Weg, um in einer abstrakte Klasse/Schnittstelle
"StreamableData" statische Methoden und Eigenschaften "abstrakt" zu
erstellen. Wichtig ist hierbei die in "StreamableData" vorhandene
Eigenschaft "MinLength", welche eigentlich statisch sein müsste, da sich
diese Größe je nach Klasse ändert (nicht nach Objekt!). Zudem gibt es
eine statische Methode "FromBin()", welche ebenfalls für jede Klasse
wieder anderst verläuft und zudem eigentlich verschiedene Objekttypen
zurück gibt (je nach Klasse halt eben).
Für eine genaue Veranschaulichung des Problems, siehe angehängte UML.
Das Problem ist, dass C# keine statische und gleichzeitig abstrakte
Methoden/Eigenschaften zulässt und der Datentyp var nicht zulässig ist
für eine Methode.
Ich hoffe das Problem ist verständlich...
lg Sven
Sven schrieb:> Ich suche nach einem Weg, um in einer abstrakte Klasse/Schnittstelle> "StreamableData" statische Methoden und Eigenschaften "abstrakt" zu> erstellen.
Das geht schlicht nicht, aus logischen Gründen.
> Das Problem ist, dass C# keine statische und gleichzeitig abstrakte> Methoden/Eigenschaften zulässt
Das ist genau deswegen so.
Die Sache ist einfach die: Ein abstrakte Methode ist nix anderes als das
Versprechen, in einem Erben der Klasse in der VMT einen Zeiger auf eine
entsprechende Methode bereitzustellen. Es wird also nur im Bauplan von
Instanzen aller Erben der Klasse Platz für einen Eintrag in der VMT
reserviert. Die Erben wissen dann zusätzlich, was sie auf diesen Platz
schreiben müssen, wenn eine Instanz von ihnen gebaut wird, weil in ihnen
eine entsprechende Methode die abstrakt definierte der Elternklasse
überschreibt.
Klassen selber besitzen keine VMT, das tun nur Instanzen einer Klasse.
Sprich: diese Konzept der Vererbung kann für statische Methoden nicht
funktionieren, weswegen es auch nicht zugelassen wird.
Die einzige Möglichkeit, wenigstens nähungsweise das von dir gewünschte
zu erreichen, ist "Shadowing". (Das C#-Schlüsselwort dafür ist
idiotischerweise nicht "shadows" wie in VB.net, sondern "new", was die
Sache wesentlich schlechter beschreibt und obendrein auch anderweitig
besetzt ist)
Wie auch immer: Das ermöglicht keine Polymorphie. Man muss explizit auf
die Klasse zugreifen, deren Schattenmethode man ausführen will, um
tatsächlich die richtige zu erwischen.
Anstelle der Methode FromBin() würde ich
Konstruktoren vorsehen, die byte[] als
Parameter entgegennehmen. Alternativ
den Rückgabewert von FromBin() in
StreamableData ändern.
Und MinLength jetzt zwingend statisch
machen, nur weil das so die Realität am
besten widerspiegelt: Niemand wird dich
erschiessen, wenn die Eigenschaft nicht
statisch ist.
Du wirst immer Kompromisse machen müssen,
die perfekte "Goldkantenlösung" wird man
selten umsetzen können.
merciless
c-hater schrieb:> Wie auch immer: Das ermöglicht keine Polymorphie. Man muss explizit auf> die Klasse zugreifen, deren Schattenmethode man ausführen will, um> tatsächlich die richtige zu erwischen.
Leider... Deswegen fällt das shadowing schon sicher ins Wasser :(
Dirk K. schrieb:> Anstelle der Methode FromBin() würde ich> Konstruktoren vorsehen, die byte[] als> Parameter entgegennehmen.
Das hab ich bereits vorgesehen. Die FromBin()-Methode ist mir zum Glück
auch nicht so wichtig. Wär halt nur schön gewesen, wenns im gleichen zug
geht.
nicht"Gast" schrieb:> Du kannst ja ein Poperty abstract machen. dann muss man es in der> Ableitung überschreiben.
Ist klar, verwende ich auch fur "Length", aber "MinLength" wäre halt
eigentlich ein statischer Fall, was ja leider nicht geht...
Dirk K. schrieb:> Du wirst immer Kompromisse machen müssen,> die perfekte "Goldkantenlösung" wird man> selten umsetzen können.
So siehts im Moment leider aus... :/
nicht"Gast" schrieb:> Aber eigentlich scheinst du den falschen Ansatz zu verfolgen. Ich> glaube, du willst Daten über irgend was verschicken. Das macht man mit> Serialisierung.
Gut zu Wissen, kannte ich noch nicht! Es wird tatsächlich an einen
Server versendet. Die Applikation Serverseitig läuft allerdings mit C++,
weswegen mir da die XML-Variante für allfällige Änderungen besser
aussieht.
Danke schon mal für eure Vorschläge
Nicht"Gast" schrieb:> Wenn es weniger Geschwätzig sein soll, gibt's auch einen json> Serializer. Da fällt weniger Overhead an.
Jo, das sieht noch besser aus, danke!
Roger S. schrieb:> Evtl. ist ein custom attribute etwas fuer Dich.
Ich hatte zuvor noch nie mit Custom Attributes gearbeitet, sieht aber
deutlich mehr nach dem aus, was ich mir vorstelle. Ich versuche grade
mit der Microsoft Dokumentation deinen Code nachzuvollzuiehen. Wird noch
ne weile gehen, bis ich dieses Kapitel ganz verstanden habe. Danke
schonmal!