Objektorientierte Programmierung

Click here to load reader

  • date post

    14-Jan-2016
  • Category

    Documents

  • view

    29
  • download

    1

Embed Size (px)

description

Objektorientierte Programmierung. Datentyp. Variable. . In C:. In C++ darf man einen Datentyp selbst basteln Dieser heisst dann:. Klasse. . Objekt. ist eineVariable. Kurz: Eine Klasse ist ein höherer, selbstgebastelter Datentyp. Genauer:. - PowerPoint PPT Presentation

Transcript of Objektorientierte Programmierung

  • ObjektorientierteProgrammierung

  • In C:DatentypVariable

    Klasse

    Objektist eineVariableIn C++ darf man einenDatentyp selbst bastelnDieser heisst dann:

  • Kurz:Eine Klasse ist ein hherer, selbstgebastelter Datentyp.

  • Genauer:

  • Eine Klasse ist ein Bauplan (vergleichbar: Backform) .In diesem Bauplan steht genau beschrieben, wie ein konkretes Objekt, das nach diesem Bauplan gebastelt wird, auszusehen hat.

  • Mit dieser Backform knnen dann ganz konkret z.B. Marmorkuchen gebacken werden.In der Fachsprache sagt man: Ein Objekt ist eine Instanz einer Klasse.

  • Beispiel:

  • BackformMarmor-kuchenGeburts-tagskuchen von RolfKlasse

    Objekt

  • Eine Klasse enthlt Daten und Funktionen.Die Daten heissen Attribute, die Funktionen heissen Methoden.Der Sammelbegriff fr Daten und Funktionen ist Member (Mitglieder).

  • Sinn:Mit Hilfe der Methoden soll man auf die Attribute zugreifen (lesen bzw. ndern der Attribute)

  • Beispiel in C++(genaue Diskussion):

  • class Punkt{ private: int x; int y; public: void set_xy(int px, int py){ x = px; y = py; } int get_x(){ return(x); } int get_y(){ return(y); } }; // class PunktName der Klasseprivater Bereich: Auf die Member des privaten Bereichs kann auerhalb der Klasse nicht direkt, sondern nur indirekt ber Methoden des public Bereichs dieser Klasse zugegriffen werden.ffentlicher Bereich: Auf die Member dieses Bereichs kann man jederzeit zugreifen.Bitte abschreiben !

  • class Punkt{ private: int x; int y; public: void set_xy(int px, int py){ x = px; y = py; } int get_x(){ return(x); } int get_y(){ return(y); } }; // class Punktpx bzw. py sind selbstsprechende Namen fr Parameter x bzw. Parameter y

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}Tipp: Klassennamen immer mit einem Grobuchstaben beginnen. (Zwar erlaubt der Compiler auch einen Kleinbuchstaben, doch halten sich fast alle Programmierer an diese Regel.

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}

    p.xp.ykxky

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}

    p.xp.ykxky35??

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}Fehlermeldung:x ist private(ein privater Bereich)

    p.xp.ykxky35??

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}

    p.xp.ykxky35??

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}

    p.xp.ykxky35??79??

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}

    p.xp.ykxky35??79??

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}

    p.xp.ykxky35??79??797?

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}

    p.xp.ykxky35??79??797?

  • #include "stdafx.h"#include

    class Punkt{//siehe oben};

    int main(){ int kx, ky; Punkt p; p.set_xy(3,5); p.x = 12; p.set_xy(7,9); kx = p.get_x(); ky = p.get_y();}

    p.xp.ykxky35??79??797?7979

  • Nochmals zu den Zugriffsrechten im folgenden kleinen Demo-Programm

  • class Punkt{ private: int x; int y; public: void set_x(int px){ x = px; } void set_y(int py){ y = py; } void set_xy(int px, int py){ set_y(py); set_x(px); }}; int main(){ Punkt p; p.x = 12; p.set_xy(2,3);} privater Bereich: Zugriff von auerhalb der Klasse: neinZugriff innerhalb der Klasse: japublic (ffentlicher) Bereich : Zugriff von auerhalb der Klasse: jaZugriff innerhalb der Klasse: ja// auerhalb, x private: nein// innerhalb, set_xy public: ja// innerhalb, x private: ja// auerhalb, set_xy public: ja// innerhalb, y private: ja

  • Aufgabe:Ergnzen Sie die Klasse Punkt mit weiteren Membern. (siehe bungsaufgabenblatt)

  • Eine Klasse kann durch die sogenannte UML (Unified Modeling Language) beschrieben werden.

  • UML ist eine formale Sprache zur objektorientierten Spezifikation, Visualisierung, Konstruktion und Dokumentation von Softwaresystemen und Geschftsmodellen.

  • Mit UML kann man z.B.die Klasse Punkt wie folgt darstellen:

  • - bedeutet: Attribut bzw. Methode ist privat + bedeutet: Attribut bzw. Methode ist public AttributeMethoden

    Punkt - x: int - y: int + set_x(int px): void + set_y(int py): void + set_xy(int px, int py): void

  • Warum soll man folgende Aussage befolgen ?

    Mit Hilfe der Methoden soll man auf die Attribute zugreifen (lesen bzw. ndern der Attribute)

  • Warum macht man diesen Umweg ber die Methoden ?

    Warum greift man nicht direkt auf die Attribute zu ?

  • Schauen wir uns dazu ein paar Beispiele aus der tglichen Praxis an...

  • Schauen wir uns dazu ein paar Beispiele aus der tglichen Praxis an...

  • Warum benutzen wir an der Kasse im Supermarkt als Werkzeug den Kassierer, um auf die Kasse zuzugreifen ?Warum machen wir das nicht direkt (ohne den Kassierer) ?

  • Weil man dann den Kassenstand auf einen unerwnschten Wert verndern und einen ungewollten Ortswechsel der Kasse veranlassen kann!

  • Warum benutzen wir am Bankschalter als Werkzeug die EC-Karte, um auf die Kasse der Bank zuzugreifen ?Warum machen wir das nicht direkt (ohne Banker oder ohne EC-Karte) ?

  • Weil man dann den Kassenstand auf einen unerwnschten Wert verndern kann !

  • Warum wird in einigen Autos als Werkzeug das ABS-System benutzt ?

    Warum bremst man nicht direkt mechanisch (ohne Elektronik) ?

  • Weil man dann die Bremskraft auf einen unerwnschten Wert verndern kann (Bremsen blockieren)!

  • Warum wird in einigen Husern als Werkzeug ein Thermostat verwendet, um die Temperatur zu regeln ?Warum macht man dies nicht direkt (einfllen von Heizl in den lofen) ?

  • Weil man dann z.B. in krzester Zeit zu viel Heizl in den Ofen leeren kann und es dann zu nicht gewnschten Verbrennungseffekten (Ofen explodiert !) kommen kann.

  • Weitere Beispiele:

  • Im Airbus, dem vollelektronischen Flugzeug, greift der Pilot nur ber die Elektronik auf das Hhenruder, usw. zu

  • Die Opferbchse in der Kirche besitzt eine Vorrichtung, die den Geldflu nur in eine Richtung zult.

  • Der Zugriff ber die Boxhandschuhe auf den Krper des Gegners schtzt diesen zumindest in einem gewissen Mae.

  • Die Verheiratung von Ehepartnern geschieht durch eine untere Verwaltungsbehrde. Dadurch sollen unerwnschte Vermhlungen der handelnden Subjekte (enge Verwandtschaft, Artenschrankenberschreitung) verhindert werden.

  • Diese Werkzeuge (Kassierer, EC-Karte, ABS-System, usw.) werden so gebastelt, da sie es nicht erlauben, bestimmte Systemparameter (Geldmenge in Kasse, usw.) auf unerwnschte Werte abzundern.

  • In C++ sind diese Werkzeuge Methoden, die es dem Klassen-Programmierer(= Programmierer, der Klassen verwendet) nicht erlauben, die Attribute auf unerwnschte Werte abzundern.

  • Wenn eine Methode dies garantiert, nennt man dies auch Zusicherung (englisch: constraint)

  • Beispiel in C++:

  • class Konto{ private: double stand;

    public: void setKonto(double geld){ stand = geld; }

    void abheben(double geld){ if(stand-geld > -5000) stand = stand - geld; }}; // class KontoName der Klasseprivater Bereich: Auf die Member des privaten Bereichs kann auerhalb der Klasse nicht direkt, sondern nur indirekt ber Methoden des public Bereichs dieser Klasse zugegriffen werden.ffentlicher Bereich: Auf die Member dieses Bereichs kann man jederzeit zugreifen.

  • class Konto{ private: double stand; public: void setKonto(double geld){ stand = geld; } void abheben(double geld){ if(stand-geld > -5000) stand = stand - geld; }}; // class Konto

    int main(){ Konto k; k.setKonto(1000); k.abheben(7000);}k.stand : 1000

  • class Konto{ private: double stand; public: void setKonto(double geld){ stand = geld; } void abheben(double geld){ if(stand-geld > -5000) stand = stand - geld; }}; // class Konto

    int main(){ Konto k; k.setKonto(1000); k.abheben(7000);}k.stand : 1000 Zusicherung:Kontostand > -5000

  • In UML

  • - bedeutet: Attribut bzw. Methode ist privat + bedeutet: Attribut bzw. Methode ist public {stand > -5000}Zusicherung

    Konto - stand: double + setKonto(double geld):void + abheben(double geld): void

  • Programmierstil

  • Eine Methode kann man (rein syntaktisch, ohne dass sich irgendetwas inhaltlich ndert) auch ausserhalb einer Klasse implementieren.

  • Dies ist der bessere Programmierstil. Deshalb werden wir diesen zuknftig immer verwenden !

  • Dazu muss man den aber den vollstndig qualifizierten Namen der Methode angeben.

  • Dies geschieht dadurch, dass man dem Methodenname den Klassennamen gefolgt von zwei Doppelpunkten voranstellt.

  • Beispiel:

  • class Punkt{ private: int x; int y;

    public: void set_xy(int px, int py){ x = px; y = py; } // ...}; // class PunktDies ist der bisher bekannte Fall.Eine Methode kann aber auch ausserhalb der Klasse implementiert werden.

  • class Punkt{ private: int x; int y;

    public: void set_xy(int px, int py);}; // class Punkt

    void Punkt::set_xy(int px, int py){ x = px; y = py; }

    ... und auerhalb der Klasse definiert (implementiert) werden unter Angabe des voll qualifizierten Namens.Dies ist ein der bessere Programmierstil !Dazu mu die Methode in der Klasse deklariert werden (ohne Methodenkrper).