Objektorientiertes Programmieren III

Ähnliche Dokumente
Algorithmen und Datenstrukturen

Objektorientierte Programmierung OOP

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Einstieg in die Informatik mit Java

Objektorientierte Programmierung OOP

Vererbung und Polymorphie

Programmierkurs C++ Abstrakte Klassen und Methoden

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Einstieg in die Informatik mit Java

Vererbung. Martin Wirsing. Ziele. Vererbung

Vererbung, Polymorphie

Einführung in die Programmiersprache Java II

14. Java Klassen. Klassen (Java) vs. Records (Pascal) Klassen - Konzeptuell. Klassen - Technisch

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern

Programmierkurs Java

Javakurs 2013 Objektorientierung

Einstieg in die Informatik mit Java

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Begriffe 1 (Wiederholung)

Repetitorium Informatik (Java)

Einführung in die Informatik

Strategy & Decorator Pattern

Kapitel 6. Vererbung

11 Objektorientierte Programmierung, Teil 2

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Kapitel 6. Vererbung

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

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Exceptions und Vererbung

Kapitel 6. Vererbung

Informatik I Eprog HS12

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

Programmieren in Java

Ein Entwurfsmuster der GoF. vorgestellt von. Sigrid Weil 16. Januar 2008

Programmierkurs Python I

Objektorientierte Programmierung Studiengang Medieninformatik

Software Engineering Klassendiagramme Einführung

3. Das erste eigene Programm mit Greenfoot: Litte Crab

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

5.5.8 Öffentliche und private Eigenschaften

Vererbung und Polymorphie

Kompetent objektorientiert programmieren

Beuth Hochschule Parameter-Übergabe-Mechanismen WS17/18, S. 1

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Javakurs für Anfänger

Objektorientierte Programmierung Studiengang Medieninformatik

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Java Einführung Vererbung und Polymorphie. Kapitel 13

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Factory Patterns und deren Auswirkung auf die Softwarearchitektur in der Praxis

Informationsverarbeitung im Bauwesen

4. Vererbung. Idee der Vererbung. Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende Klassen vor:

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Grundlagen von Python

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

SmallTalk - Eine kurze Einführung

Programmiertechnik Vererbung & Polymorphismus für Fortgeschrittene

Vererbung und Traits

Programmieren I. Kapitel 8. Vererbung

Einstieg in die Informatik mit Java

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

Informatik II Übung 06. Benjamin Hepp 5 April 2017

10 Objektorientierte Programmierung, Teil 1

Einführung in die Programmierung

FACHHOCHSCHULE MANNHEIM

Algorithmen und Datenstrukturen 07

Prinzipien der objektorientierten Programmierung (OOP)

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Objektorientierung: Klassen und Objekte

Java Einführung Methoden in Klassen

6. Globalübung (zu Übungsblatt 8)

Objektorientierte Programmierung

Klassenvariablen, Klassenmethoden

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Python 2. Vorlesung Computerlinguistische Techniken Alexander Koller. 28. Oktober 2014

Java für Bauingenieure

Objektorientierte Programmierung

Ersetzbarkeit und Verhalten

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Transkript:

Objektorientiertes Programmieren III Symbolische Programmiersprache Benjamin Roth and Annemarie Friedrich Wintersemester 2016/2017 Centrum für Informations- und Sprachverarbeitung LMU München 1

Recap: Klassen = Baupläne Klassen sind Baupläne/Designs für Objekte. Objekte mit Hilfe von Klassen erstellen: Wir instanziieren objects. Objekte = Instanzen einer Klasse. Objekte einer Klasse haben die gleiche grundlegende Struktur, können sich aber in verschiedenen Aspekten unterscheiden. 2

Recap: Vererbung Verschiedene Objekte haben teilweise dasselbe Verhalten / dieselben Charakteristika. Vererbung Code-Dopplungen vermeiden. 3

Beispiel Bank Sparkonto: Für jedes Konto werden Kontonummer, Kontoinhaber und Kontostand gespeichert. Der Kontostand muss 0 sein. Eine Zinsrate, die für alle Sparkonten gemeinsam definiert ist, kann angewendet werden. Auf das Konto kann Geld eingezahlt werden. Der Kontoauszug (der ausgedruckt werden kann) beinhaltet die Kontonummer, den Kontoinhaber und den Kontostand. Girokonto:Für jedes Konto werden Kontonummer, Kontoinhaber und Kontostand gespeichert. Der Kontostand muss innerhalb dem für jeden Kunden separat definierten Kreditrahmen liegen. Wenn der Kreditrahmen von Anne $500 ist, darf ihr Kontostand minimal -$500 betragen. Auf das Konto kann Geld eingezahlt werden. Der Kontoauszug (der ausgedruckt werden kann) beinhaltet die Kontonummer, den Kontoinhaber und den Kontostand. Klassendesign: Tafel 4

Gemeinsamkeiten/Generelle Funktionalität: Überklasse 1 class Account: 2 ''' a class providing general 3 functionality for accounts ''' 4 # CONSTRUCTOR 5 def init (self, num, person): 6 self.balance = 0 7 self.number = num 8 self.holder = person 9 # METHODS 10 def deposit(self, amount): 11 self.balance += amount 12 def withdraw(self, amount): 13 if amount > self.balance: 14 amount = self.balance 15 self.balance -= amount 16 return amount 17 def str (self): 18 res =... 19 return res 5

Spezialfälle: Unterklassen SavingsAccount basiert auf Account Methoden der Überklasse sind in der Unterklasse (und Instanzobjekten der Unterklasse) verfügbar 1 annesacc = SavingsAccount(1, "Anne") 2 annesacc.deposit(200) 3 annesacc.apply_interest() 4 print(annesacc) 6

Spezialfälle: Unterklassen SavingsAccount is based on Account SavingsAccount is derived from Account SavingsAccount extends Account Methoden der Überklasse sind in der Unterklasse (und Instanzobjekten der Unterklasse) verfügbar SavingsAccount stellt zusätzliche Funktionalität bereit 1 class SavingsAccount(Account): 2 ''' class for objects representing savings accounts. 3 shows how a class can be extended. ''' 4 interest_rate = 0.035 5 # METHODS 6 def apply_interest(self): 7 self.balance *= (1+SavingsAccount.interest_rate) 7

Methoden überschreiben Die Account-Klasse hat auch init and withdraw Methoden Die CheckingAccount-Klasse überschreibt diese 1 annesacc = CheckingAccount(1, 2 "Anne", 500) 3 annesacc.deposit(200) 4 annesacc.withdraw(350) 5 print(annesacc) Welche Methoden werden aufgerufen? init deposit withdraw str 8

Methoden überschreiben Die Account-Klasse hat auch init and withdraw Methoden Die CheckingAccount-Klasse überschreibt diese 1 class CheckingAccount(Account): 2 # CONSTRUCTOR 3 def init (self, num, person, credit_range): 4 print("creating a checkings account") 5 self.number = num 6 self.holder = person 7 self.balance = 0 8 self.credit_range = credit_range 9 # METHODS 10 def withdraw(self, amount): 11 amount = min(amount, abs(self.balance \ 12 + self.credit_range)) 13 self.balance -= amount 14 return amount 9

Klassenhierarchie Welche Methoden werden ausgeführt, wenn die folgenden Methoden auf annesacc oder stefansacc aufgerufen werden? init str deposit withdraw apply_interest 10

Polymorphismus Vielgestaltigkeit (Griechisch) Methode wird auf Objekte angewandt was passiert, hängt von der Klassenhierarchie ab Beispiel Anwendungscode: annesacc.withdraw(400) Es ist egal, von welchem Typ annesacc ist Python folgt der Klassenhierarchie und erzeugt das gewünschte Verhalten 11

Klassenhierarchie: Design Wir hätten auch zwei withdraw-methoden definieren können (eine in jeder Unterklasse). Warum könnte es nützlich sein, sie in der Account-Klasse zu haben? 12

Redundanz Wenn die Daten für ein Objekt mehrfach existieren (z.b. Kontoinhaber-Info separat für jedes Konto führen) Inkonsistenzen möglich Derselbe Code wird mehrfach geschrieben Wartung schwierig 1 class Account: 2 def init (self, num, person): 3 self.balance = 0 4 self.number = num 5 self.holder = person 6 7 class CheckingAccount(Account): 8 def init (self, num, person, credit_range): 9 self.number = num 10 self.holder = person 11 self.balance = 0 12 self.credit_range = credit_range 13

Redundanzen minimieren Hier: Methode einer Überklasse aus einer Unterklasse aufrufen Methode der Überklasse erweitern Methode wird auf der Klasse aufgerufen Referenz auf Instanzobjekt muss hier explizit an self übergeben werden 1 class Account: 2 def init (self, num, person): 3 self.balance = 0 4 self.number = num 5 self.holder = person 6 7 class CheckingAccount(Account): 8 def init (self, num, person, credit_range): 9 Account. init (self, num, person) 10 self.credit_range = credit_range 14

Redundanzen minimieren: weiteres Beispiel 1 class Account: 2 def withdraw(self, amount): 3 self.balance -= amount 4 return amount 5 6 class SavingsAccount(Account): 7 def withdraw(self, amount): 8 if amount > self.balance: 9 amount = self.balance 10 cash = Account.withdraw(self, amount) 11 return cash 12 13 class CheckingAccount(Account): 14 # METHODS 15 def withdraw(self, amount): 16 amount = min(amount, 17 abs(self.balance + self.credit_range)) 18 cash = Account.withdraw(self, amount) 19 return cash 15

UML Klassendiagramm: Vererbung 16

Mehrfachvererbung In einigen objektorientierten Sprachen (z.b. Java) können Klassen nur eine einzige Klasse erweitern. In Python kann eine Klasse von mehreren Klassen erben Multiple Inheritance (Mehrfachvererbung) Methodenaufruf welche Klasse? spezielle Mechanismen Empfehlung: im Moment max. eine Überklasse nutzen! 17

Everything in Python is an object Wir benutzen eigentlich die ganze Zeit schon Objekte... Listen und Dictionaries sind Objekt Erzeugung mit spezieller Syntax (Klassenaufruf auch möglich) Strings und Zahlen sind auch Objekte 1 # create a new list object 2 mylist = [] 3 # call a method of the list object 4 mylist.append(4) 5 # create a new dictionary object 6 mydict = {} 7 # call a method of the dictionary object 8 mydict["somekey"] = "somevalue" Zeile 8 ruft eine Hook-Methode des Dictionaries auf: setitem (self, key, value) 18

Everything in Python is an object Wir können auch Unterklassen der built-in-klassen erstellen Hier: Hooks überschreiben 1 class TalkingDict(dict): 2 # Constructor 3 def init (self): 4 print("starting to create a new dictionary...") 5 dict. init (self) 6 print("done!") 7 # Methods 8 def setitem (self, key, value): 9 print("setting", key, "to", value) 10 dict. setitem (self, key, value) 11 print("done!") 12 13 print("we are going to create a talking dictionary!") 14 mydict = TalkingDict() 15 mydict["x"] = 42 19

Verständnis von OOP ist nützlich, weil... Wir programmieren im wahren Leben selten from scratch Wir erweitern / modifizieren bestehenden Code Framework = Sammlung von (Über-)Klassen, die häufige Programmieraufgaben implementieren Wir müssen verstehen, wie die Klassen des Frameworks zusammenarbeiten Wir schreiben Unterklassen, die das Verhalten für unseren Anwendungsfall spezialisieren Rezepte dafür: Design Patterns (Design Patterns: Elements of Reusable Object-Oriented Software by: Gamma, Helm, Johnson, Vlissides) 20

Terminologie: Datenkapselung (encapsulation) Wird in der OOP-Literatur für zwei Aspekte benutzt: 1. Daten sollten versteckt sein, Zugriff nur über Instanzmethoden 2. Programm-Logik soll in Schnittstellen (Interfaces) (Klassennamen und Methodennamen) so verpackt sein, dass jede Funktionalität nur einmal definiert ist 21

References Mark Lutz: Learning Python, Part VI, 4th edition, O Reilly, 2009. Michael Dawson: Python Programming for the Absolute Beginner, Chapters 8 & 9, 3rd edition, Course Technology PTR, 2010. 22