mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Sven (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk K. (merciless)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: nicht"Gast" (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Du kannst ja ein Poperty abstract machen. dann muss man es in der 
Ableitung überschreiben.
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.

Autor: nicht"Gast" (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
public abstract int minLenght {get => 3;}


int richtig geschrieben.

Autor: nicht"Gast" (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, noch ein Versuch. Der Code oben ist natürlich quatsch. Wenn man 
etwas abstract macht, darf man keinen Body deklarieren.
abstract class BaseClass{
        public abstract int MinLength { get; }
}

class InheritClass : BaseClass {
        public override int MinLength => 3;
}


Wenn du MinLength nicht überschreibts, gibts mecker vom Compiler.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nicht"Gast" (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roger S. (edge)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Evtl. ist ein custom attribute etwas fuer Dich.

Cheers, Roger

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.