Laden...

Abgeleitete Klasse aus Anzahl Bytes parsen instanziieren und validieren

Erstellt von ill_son vor 3 Jahren Letzter Beitrag vor 3 Jahren 776 Views
I
ill_son Themenstarter:in
227 Beiträge seit 2009
vor 3 Jahren
Abgeleitete Klasse aus Anzahl Bytes parsen instanziieren und validieren

Hallo folgende Frage:

ich habe eine abstrake Basisklasse, von der ich andere Klassen ableite. Gemeinsamkeit aller Klassen ist, dass ihr Inhalt durch byteweise Daten bestimmt wird, die ich aus einem angeschlossenen Gerät bekomme. Nun möchte ich aus einer bestimmten Anzahl an Bytes die Klasse instanzieren und gleich noch auf eventuelle Datenfehler prüfen. Am liebsten mit einer TryParse-Methode, aber die müsste ich dann komplett in jeder abgeleiteten Klasse neu implementiern, was nicht schön ist, weil ich dann bei einer Änderung in der Basisklasse alle abgeleiteten Klassen anfassen müsste. Momentan übergebe ich das ByteArray in den Konstruktor und setzte am Ende eine IsValid Variable.

Gibt es einen eleganteren "offiziellen" Weg dafür?

Grüße, Alex

Final no hay nada más

T
2.219 Beiträge seit 2008
vor 3 Jahren

Einen offiziellen Weg nicht aber ich würde sowas auch nicht in die Verantwortung der Klasse geben.
Für diesen Fall lege ich mir eine entsprechende Parser Klasse an, die dann in einem TryParse dann versucht die Daten zu ermitteln und die entsprechende Instanz zu befüllen.

Wenn alle Klassen eine gemeinsame Basis Klasse haben, könntest du ähnlich wie die .NET TryParse Methoden dann im out Parameter eine Instanz der Basis Klasse liefern.
Diese entspricht dann aber bei einem true der spezifischen Klasse.

Hier solltest du sogar ein Interface haben, dann kannst du auch das Interface im out Parameter liefern.
Falls du aber z.B. einen Block mit mehreren Einträgen haben kannst, solltest du prüfen ob du im Parser gleich alles durchparsen und liefern kannst.

In der einfachsten Form sieht dann ungefähr so aus bei mir.


interface MyInterface
{
    // Methoden/Eigenschaften
}

class MyClass : MyInterface
{
    // Methoden/Eigenschaften implementiert!
}

class MyClassParser
{
    private byte[] _data = null;

    public MyClassParser(byte[] data)
    {
        this._data = data;
    }

    public bool TryParse(out MyInterface result)
    {
        // Hier die Daten aus _data parsen und im Fehlerfall false liefern
        // Wenn alles passt, dann true liefern und in result die fertige Instanz liefern
    }
}

Kann man aber auch über Exceptions lösen, was auch mehr Aufschluss auf die Daten erlaubt.
Z.b. ungültige/unbekannte Klassen Informationen etc.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

W
955 Beiträge seit 2010
vor 3 Jahren

Gibt es einen eleganteren "offiziellen" Weg dafür? Wenn du nicht weißt welches konkrete Objekt gesendet wird: Zuständigkeitskette / Chain of responsibility pattern

I
ill_son Themenstarter:in
227 Beiträge seit 2009
vor 3 Jahren

Danke, das schaue ich mir mal an.

Final no hay nada más