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/10 14:44] – 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 |
| - | **Auftrag** | + | |
| - | - Definiere in Minecraft eine Klasse '' | + | |
| - | - Füge bei deinem Haus Datenkapselung hinzu, d.h. schütze die Instanzvariablen vom Zugriff von Aussen und füge Getter- und Setter-Methoden hinzu. | + | |
| - | </ | + | |
| - | + | ||
| - | [[https:// | + | |
| - | + | ||
| - | ==== Eine Haus-Klasse | + | |
| <sxh python> | <sxh python> | ||
| Zeile 144: | Zeile 137: | ||
| </ | </ | ||
| - | < | + | < |
| - | **Auftrag** | + | **Auftrag |
| - | - Betrachte | + | - Betrachte |
| - | - Welche Klassen wurden | + | - Welche Klassen |
| - Gibt es Klassenvariablen und Klassenmethoden? | - Gibt es Klassenvariablen und Klassenmethoden? | ||
| - | - Gibt es Instanzvariablen und Instanzmethoden? | + | - Gibt es Instanzvariablen und Instanzmethoden? |
| - | - Füge bei deinem Haus Datenkapselung hinzu, d.h. schütze | + | - Warum wurde wohl die y-Position |
| + | - Warum wurden wohl '' | ||
| + | - Erkläre die Vererbung am Beispiel Haus. | ||
| + | - Erkläre am konkreten Programm 2.1 die Methode '' | ||
| + | | ||
| + | | ||
| </ | </ | ||
| + | |||
| + | |||
| + | <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:// | ||