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
Moin, Du kannst ja ein Poperty abstract machen. dann muss man es in der Ableitung überschreiben.
1 | public abstract in minLenght {get => 3;} |
Aber eigentlich scheinst du den falschen Ansatz zu verfolgen. Ich glaube, du willst Daten über irgend was verschicken. Das macht man mit Serialisierung. https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/concepts/serialization/ Dazu musst du deine Daten nicht von irgend einer Klasse ableiten, die diese verwurstet.
1 | public abstract int minLenght {get => 3;} |
int richtig geschrieben.
Gut, noch ein Versuch. Der Code oben ist natürlich quatsch. Wenn man etwas abstract macht, darf man keinen Body deklarieren.
1 | abstract class BaseClass{ |
2 | public abstract int MinLength { get; } |
3 | } |
4 | |
5 | class InheritClass : BaseClass { |
6 | public override int MinLength => 3; |
7 | } |
Wenn du MinLength nicht überschreibts, gibts mecker vom Compiler.
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
Wenn es weniger Geschwätzig sein soll, gibt's auch einen json Serializer. Da fällt weniger Overhead an. https://www.newtonsoft.com/json
Evtl. ist ein custom attribute etwas fuer Dich. Cheers, Roger
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!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.