Forum: PC-Programmierung C# statische Mehtoden/Eigenschaften als abstrakt


von Sven (Gast)


Angehängte Dateien:

Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Dirk K. (merciless)


Lesenswert?

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

von nicht"Gast" (Gast)


Lesenswert?

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.

von nicht"Gast" (Gast)


Lesenswert?

1
public abstract int minLenght {get => 3;}


int richtig geschrieben.

von nicht"Gast" (Gast)


Lesenswert?

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.

von Sven (Gast)


Lesenswert?

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

von Nicht"Gast" (Gast)


Lesenswert?

Wenn es weniger Geschwätzig sein soll, gibt's auch einen json 
Serializer. Da fällt weniger Overhead an.

https://www.newtonsoft.com/json

von Roger S. (edge)


Angehängte Dateien:

Lesenswert?

Evtl. ist ein custom attribute etwas fuer Dich.

Cheers, Roger

von Sven (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.