Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| ef:objektorientierte_programmierung [2022/10/04 13:59] – [2. Umsetzung in Python] lehmannr | ef:objektorientierte_programmierung [2024/10/08 15:11] (aktuell) – lehmannr | ||
|---|---|---|---|
| Zeile 3: | Zeile 3: | ||
| ==== 1. Grundlagen ==== | ==== 1. Grundlagen ==== | ||
| === 1.1 Konzept === | === 1.1 Konzept === | ||
| - | Wenn wir bisher ein Programm geschrieben haben, war der Ansatz " | + | Wenn wir bisher ein Programm geschrieben haben, war der Ansatz " |
| Die **objektorientierte Programmierung** geht von einem anderen Ansatz aus: Ein Programm besteht nicht aus einem Ablauf von Anweisungen und Funktionen, sondern aus **Objekten**. Diese Objekte haben bestimmte Eigenschaften und Methoden und sie stehen miteinander in Verbindung. Oftmals wird das Programm dann durch Events gesteuert (z.B. Tastaturanschläge, | Die **objektorientierte Programmierung** geht von einem anderen Ansatz aus: Ein Programm besteht nicht aus einem Ablauf von Anweisungen und Funktionen, sondern aus **Objekten**. Diese Objekte haben bestimmte Eigenschaften und Methoden und sie stehen miteinander in Verbindung. Oftmals wird das Programm dann durch Events gesteuert (z.B. Tastaturanschläge, | ||
| Zeile 9: | Zeile 9: | ||
| === 1.2 Begriffe === | === 1.2 Begriffe === | ||
| |< 100% 170px >| | |< 100% 170px >| | ||
| - | | ** Klasse vs. Objekt ** | Eine **Klasse** ist ein **allgemeiner Bauplan** für konkrete **Objekte**. So kann man z.B. eine Klasse Auto definieren, aus welcher man die beiden Objekte //Ferrari// oder //VW// ableiten kann. Die Objekte (oder auch Instanzen genannt) sind dann konkrete | + | | ** Klasse vs. Objekt ** | Eine **Klasse** ist ein **allgemeiner Bauplan** für konkrete **Objekte**. So kann man z.B. eine Klasse Auto definieren, aus welcher man die beiden Objekte //Ferrari// oder //VW// ableiten kann. Die Objekte (oder auch Instanzen genannt) sind dann konkrete |
| | **Eigenschaften** | Die Objekte besitzen bestimmte **Eigenschaften** (oder **Attribute** genannt), dies sind im Prinzip die Variablen, welche die konkreten Objekte beschreiben. Z.B. '' | | **Eigenschaften** | Die Objekte besitzen bestimmte **Eigenschaften** (oder **Attribute** genannt), dies sind im Prinzip die Variablen, welche die konkreten Objekte beschreiben. Z.B. '' | ||
| | **Methoden** | Die **Methoden** entsprechen den Funktionen in der üblichen Programmierung. Sie operieren auf den Objekten/ | | **Methoden** | Die **Methoden** entsprechen den Funktionen in der üblichen Programmierung. Sie operieren auf den Objekten/ | ||
| Zeile 39: | Zeile 39: | ||
| ==== 2. Umsetzung in Python ==== | ==== 2. Umsetzung in Python ==== | ||
| + | === 2.1 Eine Klasse Auto === | ||
| <sxh python> | <sxh python> | ||
| class Auto(): | class Auto(): | ||
| Zeile 78: | Zeile 79: | ||
| </ | </ | ||
| - | <WRAP round todo 80%> | + | === 2.2 Eine Klasse Haus in Minecraft mit einer Elternklsse ' |
| - | **Auftrag** | + | |
| - | - Definiere in Minecraft eine Klasse '' | + | <sxh python> |
| - | - Füge bei deinem | + | class Objekt(): |
| + | yPos = (-1)*60 # kleiner Trick, um Minecraft | ||
| + | def __init__(self, | ||
| + | self.xPos = x | ||
| + | self.zPos = z | ||
| + | |||
| + | def baue(self): | ||
| + | pass | ||
| + | |||
| + | |||
| + | class Haus(Objekt): # Haus erbt von Objekt | ||
| + | def __init__(self, | ||
| + | super().__init__(x, | ||
| + | self.__breite = b # private Variablen | ||
| + | self.__hoehe = h | ||
| + | |||
| + | def getBreite(self): | ||
| + | return self.__breite | ||
| + | |||
| + | def setBreite(self, | ||
| + | if b > 30: | ||
| + | player.say(" | ||
| + | else: | ||
| + | self.__breite = b | ||
| + | |||
| + | def baue(self): # Die Methode | ||
| + | blocks.fill(CONCRETE, | ||
| + | for xPos1 in range(self.xPos+2, self.xPos+self.__breite, 3): | ||
| + | for hoehe1 in range(-61+3, | ||
| + | blocks.place(GLASS, | ||
| + | blocks.place(GLASS, world(xPos1, hoehe1, self.zPos+self.__breite)) | ||
| + | for zPos1 in range(self.zPos+2, | ||
| + | for hoehe1 in range(-61+3, -61+self.__hoehe, | ||
| + | blocks.place(GLASS, | ||
| + | blocks.place(GLASS, | ||
| + | |||
| + | # Loch für Türe | ||
| + | blocks.place(AIR, | ||
| + | blocks.place(AIR, | ||
| + | # Türe | ||
| + | blocks.place(blocks.block_with_data(CRIMSON_DOOR, | ||
| + | |||
| + | def loesche(self): | ||
| + | blocks.fill(AIR, | ||
| + | | ||
| + | |||
| + | Hauser = [] | ||
| + | |||
| + | Haus1 = Haus(200,200,10,6) | ||
| + | Haus1.baue() | ||
| + | player.say(Haus1.xPos) #xPos ist in der Elternklasse definiert, wurde aber vererbt. | ||
| + | # player.say(Haus1.__breite) | ||
| + | player.say(Haus1.getBreite()) # die Breite mit der Getter-Methode holen | ||
| + | </ | ||
| + | |||
| + | <WRAP nicebox green> | ||
| + | **Auftrag 1** | ||
| + | - Betrachte die Programme | ||
| + | - Welche Klassen bzw. Objekte wurden definiert/ | ||
| + | - Gibt es Klassenvariablen | ||
| + | | ||
| + | | ||
| + | - Warum wurden wohl '' | ||
| + | - Erkläre die Vererbung am Beispiel Haus. | ||
| + | - Erkläre am konkreten Programm 2.1 die Methode '' | ||
| + | - Wozu ist Datenkapselung gut? Erkläre, wie sie im gegebenen Programm implementiert wurde. | ||
| + | - Was bedeuten die Begriffen **overriding (überschreiben)** und **overloading (überladen)** in der Objektorientierten Programmierung. Wird eines dieser Konzepte hier verwendet? | ||
| </ | </ | ||
| - | [[https:// | ||
| + | <WRAP nicebox green> | ||
| + | **Auftrag 2**\\ | ||
| + | Installiere die Umgebung processing.org - ich empfehle hier die ältere Version 3.5.4 herunterzuladen: | ||
| + | * Betrachte das Car-Beispiel und vesuche es zu verstehen. | ||
| + | * Erweitere das Car-Beispiel. | ||
| + | * Füge ein Element hinzu, so dass erkennbar ist, wo vorne/ | ||
| + | * Ändere das Programm, so dass man ein Auto mit den Pfeiltasten steuern kann. | ||
| + | * Versuche das Programm zu ändern, indem du eine Vaterklasse " | ||
| + | * Verwende das Prinzip " | ||
| + | </ | ||
| + | |||
| + | === 2.3 Ein Processing-Beispiel: | ||
| + | |||
| + | <sxh python> | ||
| + | |||
| + | def setup(): | ||
| + | global car1 | ||
| + | size(500, | ||
| + | background(255) # Hintergrundfarbe (weiss) | ||
| + | | ||
| + | car1 = Car(200, | ||
| + | # car2 = Car(20,100, 0, [250, | ||
| + | car1.drawCar() | ||
| + | # | ||
| + | |||
| + | def drawBackground(): | ||
| + | background(255) # Hintergrundfarbe (weiss) | ||
| + | stroke(200) # Linienfarbe (grau) | ||
| + | for i in range(0, | ||
| + | line(0, | ||
| + | line(i, | ||
| + | |||
| + | def draw(): | ||
| + | clear() | ||
| + | drawBackground() | ||
| + | car1.drive(4) | ||
| + | car1.drawCar() | ||
| + | |||
| + | |||
| + | class Car(object): | ||
| + | def __init__(self, | ||
| + | self.x = xpos | ||
| + | self.y = ypos | ||
| + | self.dir = radians(direction) | ||
| + | self.col = color1 # list of RGB-Values | ||
| + | self.w = car_width | ||
| + | self.l = car_length | ||
| + | | ||
| + | def drawCar(self): | ||
| + | v1 = PVector.fromAngle(self.dir).div(2) | ||
| + | v2 = v1.copy() | ||
| + | v2.rotate(3.14159265/ | ||
| + | vm = PVector(self.x, | ||
| + | fill(self.col[0], | ||
| + | beginShape() | ||
| + | vertex(vm.x-self.l*v1.x-self.w*v2.x, | ||
| + | vertex(vm.x-self.l*v1.x+self.w*v2.x, | ||
| + | vertex(vm.x+self.l*v1.x+self.w*v2.x, | ||
| + | vertex(vm.x+self.l*v1.x-self.w*v2.x, | ||
| + | endShape() | ||
| + | |||
| + | def drive(self, dist): | ||
| + | v1 = PVector.fromAngle(self.dir)*dist | ||
| + | self.x += v1.x | ||
| + | self.y += v1.y | ||
| + | | ||
| + | def turn(self, angle): | ||
| + | self.dir += radians(angle) | ||
| + | </ | ||
| + | |||
| + | [[https:// | ||
| + | [[https:// | ||