Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Administrator
Und wenn man von dieser Basis Klasse eine spezifische Unterklasse benötigt, habe ich mir (u.a. für mein Compiler Projekt) ein Pattern der folgenden Art angewöhnt: (...)
Und wenn man von dieser Basis Klasse eine spezifische Unterklasse benötigt, habe ich mir (u.a. für mein Compiler Projekt) ein Pattern der folgenden Art angewöhnt: [...]
Ja das ist richtig, dass es so geht. Aber das geht nur bei Zeigern.
Bei so etwas:
[...]
Bekomme ich doch ObjectSlicing? Und immer von dem Zeiger der Basisklasse auf die Childklasse zu casten, finde ich schlechten Stil.
Und wenn man von dieser Basis Klasse eine spezifische Unterklasse benötigt, habe ich mir (u.a. für mein Compiler Projekt) ein Pattern der folgenden Art angewöhnt: [...]
Wenn du eigentlich eine spezifische Unterklasse benötigst, wieso nimmt die Funktion dann einen Zeiger auf die Basisklasse als Parameter?
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
class Float; class Int; class Numeric { public: virtual Float* isFloat() { return nullptr; } virtual Int* isFloat() { return nullptr; } }; class Int : public Numeric { public: Int* isInt() override { return this; } }; class Float : public Numeric { public: Float* isFloat() override { return this; } }; class Var { private: Numeric* value; public: explicit Var(Numeric* num) : value(num) { } void semantic() { if (Float* fp = this->value->isFloat()) { // semantic for float } else if (Int* ip = this->value->isInt()) { // semantic for integer } } }; |
Administrator
Weil die semantic zu 'Var' gehört und nicht zu Int oder Float. Aber sagen wir mal, ich mache das: Man könnte es sich natürlich so hinbiegen und semantic aufsplitten. Das wäre eine Art es zu lösen, aber nicht die einzige. Mit 'meiner' Methode hätte man es zentral an einem Punkt gelöst. Also wieso soll das eine ein Design Fehler und das andere die bewährte Art sein?
Anderes Beispiel:
Ich habe eine Expression Klasse für Terme, Compare's, Condition's, Arrays etc. Nun hat jede Klasse für sich zwar die Eigenart, dass sie Natur gemäß eine Expression ist, jedoch ganz andere Verhaltensweise und damit Methoden. Ein Term nimmt Literale, Variablen und Operatoren entgegen, ein Array jedoch z.B. keine Operatoren an sich. Somit hat man in dem einen Konstrukt Methoden, die die jeweils andere Klasse gar nicht benötigt / haben darf.
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »dot« (25.08.2014, 03:09)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (25.08.2014, 06:49)
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<template class T> struct NumericTrait {}; <template> struct NumericTrait<float> { static void clear(float& v) { v = 0.0f; } } template<class T> class Numeric { public: NumericTrait<T> trait; Numeric() { trait::clear(data); } private: T data; } |
Könnt ihr diese Diskussion eventuell auslagern? Ihr betreibt gerade Topic-Napping. (auch wenn ihr Recht habt)
Werbeanzeige