Hallo,
Außerdem hast du vergessen, den Mäher abzustellen. Das kann beim Putzen gefährlich sein! ;-)
Oh, das kommt davon wenn man eine Schritt für Schritt-Anleitung umsetzt ohne sich dabei selbst Gedanken zu machen *peinlich*. Aber ich hab ja den Inhalt der Klasse Rasenmäher nicht näher gezeigt. Die Methode putzen(Rasenmäher mäher) prüft nämlich zuerst ob der Rasenmäher an ist und wirft in diesem Fall eine DangerToLifeException.
schlau! Da hast du dich ja nochmal geschickt aus der Affäre gezogen. ;-)
dein Pseudocode ist aber auch nicht gerade ein typisches Beispiel für Objektorientierung - ich wüsste auch nicht, wie man das besser verdeutlichen könnte.
Was wäre in deinen Augen denn ein typisches Beispiel für Objektorientierung?
Es sollte ein Beispiel sein, bei dem deutlich wird, dass eine Klasse
* unterschiedliche Ausprägungen haben kann
* die Methoden zur Bearbeitung selbst mitbringt
* ihre innere Realisierung nicht unbedingt nach außen zeigen muss
Ich habe die Garage, den Rasenmäher und das Grundstück als Klassen modelliert.
Ja. Da das Beispiel von jeder Klasse nur eine Instanz (ein Objekt) verwendet, werden einige Vorzügen jedoch gar nicht deutlich. Aber wenn man nach guten Beispielen sucht, landet man komischerweise oft bei Autos.
Modellieren wir doch einfach mal ein Kraftfahrzeug als Klasse. Diese abstrakte Basisklasse bringt Eigenschaften wie Leergewicht, Abmessungen, Nutzlast, Zahl der Sitzplätze, der Räder usw. als konstante Eigenschaften mit, die tatsächliche Zahl der Insassen, die Zuladung, die aktuelle Geschwindigkeit usw. als veränderliche Eigenschaften; außerdem Methoden wie aufschließen(), zuschließen(), starten(), beschleunigen(), bremsen(), lenken() und betanken(). Sie enthält außerdem als Eigenschaft ein Objekt der Klasse Motor (wiederum mit eigenen Eigenschaften und Methoden).
Davon lassen sich nun die Klassen PKW, LKW, Motorrad, Omnibus ableiten, die den Eigenschaften konkrete Werte geben und die Methoden sinnvoll implementieren. Dennoch kann man von jedem Objekt der Klassen PKW oder LKW das Leergewicht oder die Höhe abfragen, oder die Methode bremsen() aufrufen, ohne zu wissen, wie sie genau realisiert ist. Das entspricht der Sichtweise eines durchschnittlichen Autofahrers, der weiß, wie er sein Fahrzeug handhaben muss, aber er braucht nicht zu wissen, ob der Motor vier oder acht Zylinder hat, oder wie die Bremskreise aufgeteilt sind.
Findest du? Ich nicht. Wenn ich in der Küche anfange zu kochen oder zu backen, suche ich mir ja auch erst alle Utensilien und Zutaten zusammen, bevor ich überhaupt anfange - und nicht "just in time" wenn ich sie brauche.
Angenommen ich koche ein 6-Gänge-Menü in einer 8qm-Küche mit wenig Ablagefläche, ...
Dann muss ich modularisieren: Dann bereite ich den Aperitif, den Salat, die Suppe, den Hauptgang, das Dessert und den Kaffee separat (in einzelnen Modulen) vor, die ich geeignet koordinieren muss. Für jedes einzelne Modul gilt aber wieder das vorher Gesagte: Erst sicherstellen, dass auch alles da ist, was ich brauche. Denn es ist blöd, wenn man schon die Steaks in der Pfanne hat und dann erst feststellt, dass der Käse, den man zum Überbacken nehmen wollte, nicht mehr reicht.
Nein, ich würde wirklich die Sachen erst dann aus der Schublade bzw. aus dem Kühlschrank holen wenn ich sie brauche.
Dann haben wir grundsätzlich unterschiedliche Arbeitsweisen. Ist ja nicht schlimm.
Das tolle an C++ ist, dass es dir erlaubt die volle Kontrolle zu behalten. Wenn du die Abstraktionsmechanismen nicht nutzen willst, dann musst du das ja nicht tun.
Das ist natürlich richtig - aber dann haben wir ja wieder genau das, was du vorhin als suboptimal dargestellt hast: Man gibt vor, C++ zu programmieren, und nutzt es wie C.
Wobei ich es durchaus zu schätzen weiß, dass ein C++-Compiler in der Regel auch dann einige Syntax-Features von C++ unterstützt, wenn er per Compiler-Option im C-Modus betrieben wird (etwa einzeilige Kommentare oder anonyme unions).
Ich empfehle einem Anfänger, der von PHP kommt, ...
Ein Anfänger, der von PHP kommt, ist sowieso schon verkorkst. ;-)
ich kann da nur für mich sprechen. Und ich will ein System (Werkzeug, Software, Hifi-Anlage, Auto) erstmal bis ins kleinste Detail kennen, bevor ich es wirklich einsetze.
Das will ich auch. Aber ich nehme auch die Abstraktionsmöglichkeiten, die mir eine Programmiersprache bietet, dankbar an.
Naja, ich nur mit großer Skepsis, oft Widerwillen.
Ich will noch jedem Bit bei der Arbeit zusehen können, und dafür ist "echtes" C++ zu undurchsichtig. Da läuft für meinen Geschmack zuviel automatisch hinter den Kulissen ab, was ich als Programmierer nicht mehr im einzelnen mitbekomme und auch nicht beeinflussen kann.
Na dann sind Assembler und C ja genau das richtige für dich.
Diese beiden zusammen sind auch in der Tat mein liebstes Gespann. Dabei variiert der Assembler-Anteil je nach Projekt zwischen nahezu 0 und über 50%.
Ciao,
Martin
--
Die späteren Ehen sind oft glücklicher als die erste, weil das natürliche Ende bereits absehbar ist.
(George Bernhard Shaw)