Socke hat geschrieben: Do 11. Feb 2021, 09:58
hubblec4 hat geschrieben: Do 11. Feb 2021, 00:04
Das mag aber auch sicher daran liegen das du jetzt eben nicht mal auf die schnelle EBML verstehst, ich habe dazu fast ein halbes Jahr den c++ Code studiert.
Deine Beispiele sind aber auch sehr vage gehalten. Insbesondere fehlen mir bisher die Informationen zu den Unterschieden zwischen den verschiedenen Klassen. Daher demonstrieren meine Beispiele auch nur die Syntax. Die Übertragung in deinen Anwendungsfall ist dann deine Aufgbe.
Ja da hast du recht, aber ich wollte in dem Chat jetzt nicht das Thema wechseln.
Und EBML lässt sich auch nicht einfach mal so in 2 Beiträgen erklären.
Ich hatte ja einen Link gepostet der zum c++ Projekt führt, dort kann man auch nachlesen wie das mit den Macros gemacht ist, und was damit bezweckt wird.
Socke hat geschrieben: Do 11. Feb 2021, 09:58
hubblec4 hat geschrieben: Do 11. Feb 2021, 00:04
Generic steht doch eher für allgemein/typisch aber die Ebml Typen und Ebml Elemente sind alle sehr spezifisch. Das einzige was gemeinsam ist sind die Methoden und da auch nur die Methoden Namen und deren Bedeutung, aber ein TEbmlUInteger.ReadData() macht was völlig anderes als TEbmlMaster.ReadData().
Wenn du OOP verwendest, kannst du die Methoden doch mit oder ohne Generics überschreiben. Welchen Vorteil bieten dir hier Macros an, wenn die Implementierung ohnehin spezifisch ist?
Vielleicht kurz zur Erklärung als Beispiel mal an Tieren:
Es gibt soweit ich weis über 100.000Tier Arten und über 10 Trillionen Tiere auf der Welt.
Die Basis Klasse ist also TTier.
Dann würden wir ein paar TierTyp-Klassen von TTier ableiten, sagen wir mal TFleischfresser und TPfanzenfresser. (aber wir könnten und sollten da noch weitere Typen anlegen)
Nun wirds dann etwas konkreter, denn für jedes Tier legen wir nun eine Klasse an.
Damit haben wir dann 10 Trillionen Klassen.
Und in all diesen Klassen haben wir nun immer wieder die gleichen Methoden-Namen stehen. Weil diese Methoden die Basis Methoden überschreiben.
Code: Alles auswählen
TTier = class
private
FID: QWord; // die eineindeutige ID
FLebt: Boolean;
protected:
procedure Tier_Isst_gerade(const Beute: TBeute); virtual;
procedure Tier_schlaeft(const dauer: Integer); virtual;
procedure Tier_Populiert; virtual;
end;
TFleischfresser = class(TTier)
end;
TPflanzenfresser = class(TTier)
end;
TMeinHund = class(TFleischfresser)
procedure Tier_isst_gerade(const Beute: TBeute); override;
procedure Tier_schlaeft(const Dauer: Integer); override;
procedure Tier_Populiert; override;
end;
TMeineKatze = class(TFleischfresser)
procedure Tier_isst_gerade(const Beute: TBeute); override;
procedure Tier_schlaeft(const Dauer: Integer); override;
procedure Tier_Populiert; override;
end;
TMeinWolf = class(TFleischfresser)
procedure Tier_isst_gerade(const Beute: TBeute); override;
procedure Tier_schlaeft(const Dauer: Integer); override;
procedure Tier_Populiert; override;
end;
TMeinHase = class(TPflanzenfresser)
procedure Tier_isst_gerade(const Beute: TBeute); override;
procedure Tier_schlaeft(const Dauer: Integer); override;
procedure Tier_Populiert; override;
end;
TNachbarsHase = class(TPflanzenfresser)
procedure Tier_isst_gerade(const Beute: TBeute); override;
procedure Tier_schlaeft(const Dauer: Integer); override;
procedure Tier_Populiert; override;
end;
// Wie du siehst stehen in allen End-Klassen die gleichen Methoden (Namen)
// und genau da kommt der Macro ins spiel
{define CLASS_HEAD :=
procedure Tier_isst_gerade(const Beute: TBeute); override;
procedure Tier_schlaeft(const Dauer: Integer); override;
procedure Tier_Populiert; override;
}
// Nun kann man das alles kürzer schreiben
TMeinHund = class(TFleischfresser)
CLASS_HEAD
end;
Die Macros haben nichts mit Programmier-Logik zu tun, so wie es der ausgangs Titel dieses Themas sagt.
Die Macros werden nur dazu genutzt um Quellcode der identisch ist, diesen zu "ersetzen".
Die Macros sollen mir lediglich den Code verkürzen aber nicht Code-Logic beinhalten.
Die Methode Tier_Populiert wäre dann für eine Katze völlig was anders als die für ein Seepferdchen, aber dennoch ist der Methoden Name der gleiche.