Kompetent objektorientiert programmieren



Ähnliche Dokumente
Objektorientierte Programmierung OOP

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Grundlagen von Python

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Objektorientierte Programmierung

Programmieren in Java

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Einführung in die Java- Programmierung

Arbeiten mit UMLed und Delphi

Professionelle Seminare im Bereich MS-Office

Java: Vererbung. Teil 3: super()

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Archiv - Berechtigungen

GEORG.NET Anbindung an Ihr ACTIVE-DIRECTORY

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Bauteilattribute als Sachdaten anzeigen

Universal Dashboard auf ewon Alarmübersicht auf ewon eigener HTML Seite.

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Xcode/Cocoa/Objective-C Crashkurs Programmieren unter Mac OS X

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Qt-Projekte mit Visual Studio 2005

Mediator 9 - Lernprogramm

5. Abstrakte Klassen

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

Um über FTP Dateien auf Ihren Public Space Server - Zugang laden zu können benötigen Sie folgende Angaben:

Informatik für Schüler, Foliensatz 21 Objektorientierte Programmierung

Die Post hat eine Umfrage gemacht

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer. Erste Anmeldung. Schritt 1: Anmeldung..2. Schritt 2: Passwort setzen 3

Guide DynDNS und Portforwarding

Erstellen von x-y-diagrammen in OpenOffice.calc

Informationen zum Ambulant Betreuten Wohnen in leichter Sprache

Erstellen einer PostScript-Datei unter Windows XP

MSDE 2000 mit Service Pack 3a

Handbuch ECDL 2003 Modul 2: Computermanagement und Dateiverwaltung Dateien löschen und wiederherstellen

Urlaubsregel in David

Computeria Solothurn

Eva Douma: Die Vorteile und Nachteile der Ökonomisierung in der Sozialen Arbeit

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

Webalizer HOWTO. Stand:

Windows 7: Neue Funktionen im praktischen Einsatz - Die neue Taskleiste nutzen

Handbuch ECDL 2003 Basic Modul 2: Computermanagement und Dateiverwaltung Dateien löschen und wiederherstellen

Screening for Illustrator. Benutzerhandbuch

.htaccess HOWTO. zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage

4 Vererbung, Polymorphie

Zahlen auf einen Blick

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Adminer: Installationsanleitung

Internet Explorer Version 6

Eine Anwendung mit InstantRails 1.7

Stammzertifikat Importieren

Die Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden.

Erste Schritte mit TeamSpeak 3

Umstieg auf Microsoft Exchange in der Fakultät 02

Klassendiagramm der UML mit SiSy-AVR Schnelleinstieg am Beispiel myethernet-projekt

Folge 18 - Vererbung

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Was ist Sozial-Raum-Orientierung?

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

So erstellen Sie nützliche Beschreibungen zu Ihren Tradingdaten

Typo3 - Inhalte. 1. Gestaltung des Inhaltsbereichs. 2. Seitenunterteilung einfügen

Leichte-Sprache-Bilder

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Prinzipien Objektorientierter Programmierung

Lehrer: Kurs wiederherstellen

Jede Zahl muss dabei einzeln umgerechnet werden. Beginnen wir also ganz am Anfang mit der Zahl,192.

Aufklappelemente anlegen

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Leit-Bild. Elbe-Werkstätten GmbH und. PIER Service & Consulting GmbH. Mit Menschen erfolgreich

Um in das Administrationsmenü zu gelangen ruft Ihr Eure Seite auf mit dem Zusatz?mod=admin :

OP-LOG

Kinderarmut. 1. Kapitel: Kinderarmut in der Welt

Wie halte ich Ordnung auf meiner Festplatte?

VibonoCoaching Brief -No. 18

Vorkurs C++ Programmierung

Partitionieren in Vista und Windows 7/8

WinVetpro im Betriebsmodus Laptop

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Prodanet ProductManager WinEdition

Lehrer: Einschreibemethoden

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

Kurzeinführung Excel2App. Version 1.0.0

Anwendungsbeispiele. Neuerungen in den s. Webling ist ein Produkt der Firma:

Serien- mit oder ohne Anhang

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

SMART Newsletter Education Solutions April 2015

Zahlenwinkel: Forscherkarte 1. alleine. Zahlenwinkel: Forschertipp 1

Den Durchblick haben. VOLKSBANK BAD MÜNDER eg. Online aber sicher: Unsere Produkt- und Sicherheitshotline hilft und informiert

Das Leitbild vom Verein WIR

Transkript:

Kompetent objektorientiert programmieren Aegidius Plüss, Bern, www.aplu.ch Eine objektorientierte Programmiersprache steht auf drei fundamentalen Säulen: Klassenkapselung (encapsulation) Vererbung (inheritance) Polymorphismus (polymorphism) Im täglichen Leben fasst man eine Pizza als ein Objekt eines bestimmten Lebensmitteltyps auf. Darum ist es natürlich, virtuelle Pizzas ebenfalls als Objekte zu modellieren. Für jede Pizzasorte definierst du eine Klasse, in der Eigenschaften und Verhalten der zu erzeugenden Objekte festgelegt sind. Wir sagen, dass die Klasse einen Datentyp definiert und dass eine bestimmte Pizza ein Objekt oder eine Instanz mit diesem Datentyp ist. Eigenschaften werden durch Instanzvariablen (oder Attribute) beschrieben und das Verhalten durch Methoden (oder Memberfunktionen) festgelegt. Diese können nur unter Bezug auf die Klasse verwendet werden. Zudem kann der Zugriff von Aussen eingeschränkt sein. Man sagt deswegen, dass Eigenschaften und Verhalten der Objekte in ihrer Klasse gekapselt sind. Deine virtuellen Pizzas haben einen gemeinsamen Grundaufbau, aber unterschiedliche Zutaten. Der Grundaufbau jeder Pizza wird in der Klasse Pizza beschrieben und besteht aus dem Teig (dough), Tomatenstücken und Mozzarellakäse. Allerdings wird eine solche Pizza nie hergestellt, sondern nur Pizzas, die weitere Zutaten (ingredients) enthalten. Für die tatsächlich hergestellten Pizzasorten definierst du Klassen, die du aus der Klasse Pizza ableitest: Damit brauchst du die gemeinsamen Eigenschaften und Verhalten und einmal zu programmieren und vermeidest damit die gefährliche Codeduplikation. Typ, Klassenname Margarita Prosciutto Vegetariana Napoli Zutaten Oregano Schinken Gemüse Schinken, Pilze, Oliven Wie du siehst, ist die Pizza Napoli eigentlich eine Pizza Prosciutto mit Pilzen und Oliven als zusätzlichen Zutaten. Darum leitest du die Klasse Napoli nicht von Pizza, sondern von Prosciutto ab. Den Klassen gibt du die Fähigkeiten, sich grafisch darzustellen (statt dass sie in der Küche zubereitet werden). Du verwendest dazu der Einfachheit halber die Turtlegrafik, könntest aber auch eine andere Grafikbibliothek einsetzen,

beispielsweise GPanel (in Source-Download enthalten). Jedes Pizza-Objekt soll auch als Eigenschaft ihren Namen und ihren Verkaufspreis kennen, der beim Erstellen der Pizza zum Tagespreis in Schweizerfranken angegeben wird. Die Eigenschaften nennt man auch Instanzvariablen und sie werden beim Erzeugen der Pizza im Konstruktor init () definiert und initialisiert. Die Fähigkeiten modellierst du mit Methoden. Beispielsweise fügt addingredients() die Zutaten hinzu. Da es nie ein Objekt der Basisklasse Pizza geben darf, definierst du sie als eine sogenannte abstrakte Klasse und die Methode drawingredients() als abstrakte Methode, die durch diese spezielle Auszeichnung in jeder aus Pizza abgeleiteten Klassen definiert werden muss. Dies erreichst du in Python, indem du im Kopf von Pizza die Zeile metaclass =ABCMeta einfügst und vor der leeren Methode addingredients() die Annotation @abstractclass setzt. Achte darauf, dass du in jeder Methode einen zusätzlichen ersten Parameter verwenden musst, den man normalerweise self nennt (aber der auch irgendeinen anderen Namen haben kann). Mit diesem Parameter kannst du auf die aktuelle Instanz zugreifen, um beispielsweise innerhalb der Klasse Methoden aufzurufen und Instanzvariablen zu definieren, zu lesen und zuzuweisen. Methoden und Variablen ohne self gehören zum globalen Namensraum. Als global bezeichnet, können Variablen sogar auch innerhalb der Klasse definiert und zugewiesen werden, was aber schlechter Programmierstil ist und nach Möglichkeit vermieden werden sollte. # pizza.py from abc import * from math import * class Pizza(): metaclass = ABCMeta def makedough(self): setpencolor(makecolor(255, 218, 148)) dot(350) def addtomato(self): setpencolor(makecolor(200, 50, 0)) dot(300) def addmozzarella(self): setpencolor(makecolor(243, 243, 210)) for i in range(6): setpos(100 * sin(i * pi/3), 100 * cos(i * pi/3)) dot(40) def showprice(self): setpencolor("blue") setpos(-300, -250) label("please pay " + self.price + " Fr.")

def createpizza(self): self.drawdough() self.drawtomato() self.drawmozzarella() self.drawingredients() self.showprice() settitle(self.name) @abstractmethod pass Du kannst kontrollieren, dass es tatsächlich nicht möglich ist, eine Instanz von Pizza zu erzeugen. Fügst du nämlich am Ende von Pizza.py die Zeile p = Pizza() hinzu, so erhältst du bei der Ausführung die Fehlermeldung TypeError: Can't instantiate abstract class Pizza with abstract methods addingredients Die von der Basisklasse Pizza abgeleiteten Klassen erben alle ihre Methoden und müssen die Methode addingredients() überschreiben. Damit wird garantiert, dass jede Pizzasorte ihre Zutaten auch tatsächlich hinzufügt. Bei der Erzeugung der verschiedenen Pizzasorten initialisiert der Konstruktor das Attribut (die Instanzvariable) price. In einem Klassendiagramm wird die Klassenkonstruktion übersichtlich dargestellt (dabei sind abstrakte Elemente kursiv).

Es gehört zum guten Programmierstil, für jede einzelne Klassen eine separate Datei mit dem Klassennamen in Kleinschreibung zu verwenden. Da sich alle Dateien im gleichen Verzeichnis befinden, können sie problemlos importiert werden. Damit ergibt sich ein sauber entkoppeltes und übersichtliches Programmpaket. # margarita.py import random from pizza import Pizza class Margarita(Pizza): self.name = "Pizza Margarita" setpencolor(makecolor(23, 67, 0)) for i in range(50): setpos(random.random() * 200-100, random.random() * 200-100) dot(10) # prosciutto.py from pizza import Pizza class Prosciutto(Pizza): self.name = "Pizza Prosciutto" setpencolor(makecolor(230, 87, 84)) dot(155) # vegetariana.py from pizza import Pizza class Vegetariana(Pizza): self.name = "Pizza Vegetariana" setpencolor(makecolor(65, 116, 65)) dot(150) # napoli.py

from math import * from prosciutto import Prosciutto class Napoli(Prosciutto): self.name = "Pizza Napoli" Prosciutto.drawIngredients(self) self.addfungi() self.addolives() def addfungi(self): setpencolor(makecolor(190, 190, 190)) dot(80) def addolives(self): setpencolor("black") for i in range(1, 5): setpos(60 * sin(i * pi/2), 60 * cos(i * pi/2)) dot(25) Schliesslich schreibst du in pizzaiolo.py das Applikationsprogramm. Dort frägt sozusagen der Pizzabäcker in einem Eingabedialog nach der gewünschten Pizzasorte und stellt dann die Pizza her. # pizzaiolo.py from margarita import Margarita from prosciutto import Prosciutto from vegetariana import Vegetariana from napoli import Napoli choice = inputstring("margarita, Prosciutto, Vegetariana or Napoli?") mypizza = None if choice == "Margarita": mypizza = Margarita("15.50") elif choice == "Prosciutto": mypizza = Prosciutto("19.50") elif choice == "Vegetariana": mypizza = Vegetariana("18.00") elif choice == "Napoli": mypizza = Napoli("22.50") else: msgdlg("sorry, no pizza of this kind!") if mypizza!= None: maketurtle() hideturtle() mypizza.createpizza() Es ist interessant, dass beim Erstellen des Programms pizzaiolo.py der Datentyp von mypizza nicht genau bekannt ist. Man weiss lediglich, dass es sich um einen Typ mit der Basisklasse Pizza handelt. Damit bleibt vorerst offen, welche der Methoden

drawingredients() beim Aufruf von mypizza.createpizza() tatsächlich aufgerufen wird. Erst nachdem der Anwender nach Start des Programms seine Pizzawahl getroffen hat, wird die entsprechende Methode ausgewählt. Da erst zu Laufzeit die Variable mypizza an den spezifischen Pizzatyp gebunden wird, um die Methode dieses Typs aufzurufen, spricht von einer dynamischen Typbindung oder von Polymorphismus (vom griechischen "Vielgestaltigkeit"). Download aller Sourcen (für Turtle und GPanel)