Abstrakte Klassen Diskussion
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Veränderung (letzte Änderung)
(keine anderen Diffs, Normalansicht)
Verändert: 30c30
: Zur Grundsätzlichen Fragestellung von KurtWatzka möchte ich sagen, dass eine Klasse in C++ erst dann abstrakt ist wenn sie mindestens eine rein virtuelle Methode enthält. Es stellt sich somit also nicht die Frage ob abstrakte Klassen sinnvoll sind wo es doch rein virtuelle Methoden gibt denn diese machen eine Klasse ja erst abstrakt. Besitzt eine Klasse eine normale (also nicht reine) virtuelle Methode ist sie desshalb nicht abstrakt. Normale virtuelle Methoden ersetzen nur die aus C bekannten und berüchtigten Macros. Diese hatten den Nachteil, dass sie nicht vom Compiler sondern vom Präprozessor verarbeitet wurden und somit keine vernünftige Fehleranalyse durchzuführen game console accessories war. Der Unterschied zwischen ganz normalen und virtuellen Methoden ist leicht erklärt: Normale Methoden werden zur Laufzeit genau einmal in den Hauptspeicher geladen auch wenn mehrere Instanzen dieser Klasse im Speicher sind. Wird eine solche Methode aufgerufen muss erst die richtige Adresse im Speicher gesucht werden an der sich die Methode befindet. Ist die Methode jedoch als virtuell definiert worden so wird sie für jede einzelne Instanz der Klasse in den Speicher geladen. Der größte Vorteil von virtuellen Methoden liegt also darin, dass die Suche nach der Methode entfällt und somit die Geschwindigkeit erhöht werden kann. Der Nachteil ist darin zu sehen, dass mehr Speicher verbraucht wird weil virtuelle Methoden ja nicht nur einmal im Speicher vorkommen können sondern beliebig oft. So komme ich zu folgendem Fazit: Abstrakte Klassen zu erstellen macht in c++ genausoviel Sinn wie in anderen OOP-Sprachen (etwa SpracheJava). Es ist auch fast genauso leicht zu erkennen ob eine Klasse abstrakt ist oder nicht. Man muss lediglich nachsehen ob eine Methode der Klasse mit = 0 endet. Natürlich ist das nicht ganz so schnell zu sehen wie in anderen Sprachen wie zum Beispiel SpracheJava wo man vor den Klassennamen einfach das Schlüsselwort abstract schreibt. Jedoch ist dies höchstens ein Schönheitsfehler den jeder ordentliche Programmierer ganz leicht umgehen kann indem er über seinem Klassennamen ein Kommentar hinterlässt wenn diese Klasse abstrakte Methoden besitzt. Wenn man es ganz genau nimmt könnte man hier sogar alle abstrakten methoden aufzählen ;) -- GeorgOrtner
|
: Zur Grundsätzlichen Fragestellung von KurtWatzka möchte ich sagen, dass eine Klasse in C++ erst dann abstrakt ist wenn sie mindestens eine rein virtuelle Methode enthält. Es stellt sich somit also nicht die Frage ob abstrakte Klassen sinnvoll sind wo es doch rein virtuelle Methoden gibt denn diese machen eine Klasse ja erst abstrakt. Besitzt eine Klasse eine normale (also nicht reine) virtuelle Methode ist sie desshalb nicht abstrakt. Normale virtuelle Methoden ersetzen nur die aus C bekannten und berüchtigten Macros. Diese hatten den Nachteil, dass sie nicht vom Compiler sondern vom Präprozessor verarbeitet wurden und somit keine vernünftige Fehleranalyse durchzuführen war. Der Unterschied zwischen ganz normalen und virtuellen Methoden ist leicht erklärt: Normale Methoden werden zur Laufzeit genau einmal in den Hauptspeicher geladen auch wenn mehrere Instanzen dieser Klasse im Speicher sind. Wird eine solche Methode aufgerufen muss erst die richtige Adresse im Speicher gesucht werden an der sich die Methode befindet. Ist die Methode jedoch als virtuell definiert worden so wird sie für jede einzelne Instanz der Klasse in den Speicher geladen. Der größte Vorteil von virtuellen Methoden liegt also darin, dass die Suche nach der Methode entfällt und somit die Geschwindigkeit erhöht werden kann. Der Nachteil ist darin zu sehen, dass mehr Speicher verbraucht wird weil virtuelle Methoden ja nicht nur einmal im Speicher vorkommen können sondern beliebig oft. So komme ich zu folgendem Fazit: Abstrakte Klassen zu erstellen macht in c++ genausoviel Sinn wie in anderen OOP-Sprachen (etwa SpracheJava). Es ist auch fast genauso leicht zu erkennen ob eine Klasse abstrakt ist oder nicht. Man muss lediglich nachsehen ob eine Methode der Klasse mit = 0 endet. Natürlich ist das nicht ganz so schnell zu sehen wie in anderen Sprachen wie zum Beispiel SpracheJava wo man vor den Klassennamen einfach das Schlüsselwort abstract schreibt. Jedoch ist dies höchstens ein Schönheitsfehler den jeder ordentliche Programmierer ganz leicht umgehen kann indem er über seinem Klassennamen ein Kommentar hinterlässt wenn diese Klasse abstrakte Methoden besitzt. Wenn man es ganz genau nimmt könnte man hier sogar alle abstrakten methoden aufzählen ;) -- GeorgOrtner
|
Verändert: 34c34
Dass eine Klasse abstrakt ist, merkt man übrigens exakt an der Compilerfehlermeldung, wenn man versucht, sie zu instanziieren. Üblicherweise steht dann auch gleich dabei, weshalb die Klasse abstrakt ist wholesale game console parts. Imho muss sowas auch nicht in der Dokumentation stehen, schließlich ist so eine Klasse nicht aus böser Absicht abstrakt, sondern aus konzeptionellen Gründen. Der Versuch, eine abstrakte Klasse zu instanziieren, ist also bereits ein Designfehler und sollte den Programmierer eigentlich nicht überraschen.
|
Dass eine Klasse abstrakt ist, merkt man übrigens exakt an der Compilerfehlermeldung, wenn man versucht, sie zu instanziieren. Üblicherweise steht dann auch gleich dabei, weshalb die Klasse abstrakt ist. Imho muss sowas auch nicht in der Dokumentation stehen, schließlich ist so eine Klasse nicht aus böser Absicht abstrakt, sondern aus konzeptionellen Gründen. Der Versuch, eine abstrakte Klasse zu instanziieren, ist also bereits ein Designfehler und sollte den Programmierer eigentlich nicht überraschen.
|
Abstrakte Klassen (Siehe auch WardsWiki:AbstractBaseClass)
Es wird behauptet, dass es in C++ nicht moeglich ist, sinnvoll abstrakte Klassen zu erstellen. Da es keine technische Beschränkung für rein virtuelle Methoden gibt, vermute ich dass der Begriff einer abstrakten Klasse hier anders verwendet wird als im Sinn einer Klasse, die zwar ein Interface festlegt, dessen Implementation aber an konkrete Klassen delegiert.
-- KurtWatzka
- Das ist genau der Grund, warum ich den Übergang von C zu C++ nie gemacht habe, trotz der vielen gelesenen Bücher und Magazine. Hunderte solcher Fragen und Diskussionen gelesen und immer das Gefühl gehabt, diese Sprache nie 100%-ig beherrschen zu können. Ich bin zu dumm dafür. -- HelmutLeitner
Abstrakte Klassen sind aber doch keine besondere Erschwernis in C++. Die Idee, dass ein Objekt, wenn es ein Fahrzeug sein will, die Nachricht fahreNach verstehen muss, dass aber für das abstrakte Fahrzeug noch nicht festgelegt wird, wie fahreNach aussehen soll, hat ja nichts mit C++ zu tun. Die kleine syntaktische Besonderheit in C++ ist, dass es kein eigenes Schlüsselwort für abstrakte Klassen gibt (wie DEFERRED in SpracheEiffel oder abstract in SpracheJava ). In C++ ist eine Klasse dann abstrakt, wenn sie, per Vererbung oder direkt, virtuelle Methoden enthält, die von abgeleiteten Klassen noch implementiert werden müssen. Die Falle ist eben, dass es einer Klasse nicht sofort anzusehen ist ob sie abstrakt ist, weil das in C++ eben eine Eigenschaft ist, die sich aus der Deklaration der Klasse und aller Vorfahren ergibt und nichts, was zusätzlich ausdrücklich in den Quelltext geschrieben werden muss. -- KurtWatzka
- Ist es nicht so, dass in C++ eine abstrakte Klasse dadurch entsteht, dass eine virtuelle Methode mit der =0-Syntax definiert wird, so dass verhindert wird, dass Instanzen dieser Klasse erzeugt werden können? Falls das so ist, fände ich es auch passender, wenn solche Merkmale nicht durch "die Hintertür", sondern durch ein Schlüsselwort erzeugt werden. -- hl
Ob eine Methode dadurch als abstrakt gekennzeichet wird, dass DEFERRED davorgeschrieben wird, oder dadurch, dass =0 dahintergeschrieben wird, ist nur Syntax. Einen Unterschied in der Ausdrucksstärke kann ich nicht erkennen. Was bleibt ist der Unterschied, dass Klassen in C++ implizit und nicht explizit abstrakt sind. Oder umgekehrt: In C++ steht nicht da, dass die Klasse
abstrakt ist, sondern warum. Die Suche nach dem Grund ist unangenehm, wenn kein geeignetes Werkzeug vorhanden ist. Das ganze ist eindeutig ein Nach^Z^Z^Z^ZVor^Z^Z^ZNachteil von C++ -- kw
[Die deutliche Fehlermeldung vom Compiler zählt nicht als Werkzeug?]
- Grundsätzlich erscheint mir die ObjektOrientierteProgrammierung noch immer auf der Suche nach der richtigen Mischung von Features. Egal ob C++, Java oder jetzt C#, ich habe nicht das Gefühl, dass hier eine Entwicklung zum Abschluß kommt. Früher (Jahre vor der OO-Welle) hatte ich viel mit der Modellierung von Vorgängen zu tun, und da entwickelt man von alleine so etwas wie ObjektOrientiertesDenken. Dabei steht aber eine 1:1-Beziehung zwischen realen Objekten und Software-Objekten im Vordergrund. Die gängige ObjektOrientierteProgrammierung scheint mir eine übermäßige Flut an Klassen zu erzeugen (z.B. 3500 Java-Klassen), die mit der Abbildung einer Realität nichts mehr zu tun haben und die in ihrer Komplexität eher kontraproduktiv sind. --hl
- VieleKleineTeile sind etwas gutes!
Absurdes Anwachsen von Klassenhierarchien ist ein Problem im objektorientierten Entwerfen, nicht ein Problem einer objektorientierten Programmiersprache. Das drängt die Diskussion jetzt aber in die Richtung, ob abstrakte Klassen überhaupt ein sinnvolles Feature einer objektorientierten Programmiersprache sind. Die Frage, die ich aufzuwerfen versucht habe, ist, ob es einen Grund für die Behauptung gibt, dass es in C++ anders als in anderen objektorientierten Programmiersprachen nicht möglich sei, sinnvoll abstrakte Klassen zu erstellen. -- kw
- Wo und vom wem ist diese Behauptung aufgestellt worden? Das Wort "sinnvoll" scheint mir in diesem Zusammenhang in seiner Bedeutung unklar. --hl
Diese Behauptung ist hier als Schwäche von C++ genannt worden. Ich vermute, dass eigentlich gemeint war, dass C++ keinen Typ wie Object an der Wurzel des Dateisystems hat, so dass Container entweder noch etwas weniger typsicher als in Smalltalk oder Java, oder aber unter Rückgriff auf GenerischeProgrammierung realisiert werden müssen. -- kw
Ja es ist sinnvoll abstrakte Klassen zu erstellen! | |
- Zur Grundsätzlichen Fragestellung von KurtWatzka möchte ich sagen, dass eine Klasse in C++ erst dann abstrakt ist wenn sie mindestens eine rein virtuelle Methode enthält. Es stellt sich somit also nicht die Frage ob abstrakte Klassen sinnvoll sind wo es doch rein virtuelle Methoden gibt denn diese machen eine Klasse ja erst abstrakt. Besitzt eine Klasse eine normale (also nicht reine) virtuelle Methode ist sie desshalb nicht abstrakt. Normale virtuelle Methoden ersetzen nur die aus C bekannten und berüchtigten Macros. Diese hatten den Nachteil, dass sie nicht vom Compiler sondern vom Präprozessor verarbeitet wurden und somit keine vernünftige Fehleranalyse durchzuführen war. Der Unterschied zwischen ganz normalen und virtuellen Methoden ist leicht erklärt: Normale Methoden werden zur Laufzeit genau einmal in den Hauptspeicher geladen auch wenn mehrere Instanzen dieser Klasse im Speicher sind. Wird eine solche Methode aufgerufen muss erst die richtige Adresse im Speicher gesucht werden an der sich die Methode befindet. Ist die Methode jedoch als virtuell definiert worden so wird sie für jede einzelne Instanz der Klasse in den Speicher geladen. Der größte Vorteil von virtuellen Methoden liegt also darin, dass die Suche nach der Methode entfällt und somit die Geschwindigkeit erhöht werden kann. Der Nachteil ist darin zu sehen, dass mehr Speicher verbraucht wird weil virtuelle Methoden ja nicht nur einmal im Speicher vorkommen können sondern beliebig oft. So komme ich zu folgendem Fazit: Abstrakte Klassen zu erstellen macht in c++ genausoviel Sinn wie in anderen OOP-Sprachen (etwa SpracheJava). Es ist auch fast genauso leicht zu erkennen ob eine Klasse abstrakt ist oder nicht. Man muss lediglich nachsehen ob eine Methode der Klasse mit = 0 endet. Natürlich ist das nicht ganz so schnell zu sehen wie in anderen Sprachen wie zum Beispiel SpracheJava wo man vor den Klassennamen einfach das Schlüsselwort abstract schreibt. Jedoch ist dies höchstens ein Schönheitsfehler den jeder ordentliche Programmierer ganz leicht umgehen kann indem er über seinem Klassennamen ein Kommentar hinterlässt wenn diese Klasse abstrakte Methoden besitzt. Wenn man es ganz genau nimmt könnte man hier sogar alle abstrakten methoden aufzählen ;) -- GeorgOrtner
Das ist ja komplett neben der Spur! Jede Methode existiert exakt einmal im Speicher und ist für alle Instanzen einer Klasse gleich, aber für verschiedene Klassen ggf. verschieden. Der Unterschied zwischen virtuellen und ordinären Methoden ist, dass jedes Objekt einen Verweis auf virtuelle Methoden mit sich herumträgt, mit dem die richtige Methode bei ihrem Aufruf gefunden wird. Welche gewöhnliche Methode aufgerufen wird, wird dagegen anhand statischer Typinformation beim Compilieren aufgelöst. Anders gesagt, virtuelle Methoden sind das, was man zum objektorientierten Programmieren benutzt und gewöhnliche Methoden sind eine Optimierung (die ein oder zwei Indirektionen spart), die man nutzen kann, wenn die späte Bindung nicht benötigt wird.
Dass eine Klasse abstrakt ist, merkt man übrigens exakt an der Compilerfehlermeldung, wenn man versucht, sie zu instanziieren. Üblicherweise steht dann auch gleich dabei, weshalb die Klasse abstrakt ist. Imho muss sowas auch nicht in der Dokumentation stehen, schließlich ist so eine Klasse nicht aus böser Absicht abstrakt, sondern aus konzeptionellen Gründen. Der Versuch, eine abstrakte Klasse zu instanziieren, ist also bereits ein Designfehler und sollte den Programmierer eigentlich nicht überraschen.
KategorieDiskussion
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 24. Oktober 2012 9:11 (diff))