Modellierung und Simulation - Objektorientierte Programmierung: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
|||
| (36 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 3: | Zeile 3: | ||
| '''Autor:''' || [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]] | | '''Autor:''' || [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]] | ||
|- | |- | ||
| '''Termin:''' || | | '''Termin:''' || 22.05.2026 | ||
|} | |} | ||
= Lernziel = | |||
=Aufgabe | Nach der Bearbeitung können die Studierenden: | ||
* abstrakte Klassen in MATLAB<sup>®</sup> erstellen | |||
* | * Vererbung anwenden | ||
* | * private/protected Eigenschaften unterscheiden | ||
* | * Polymorphismus praktisch einsetzen | ||
* | * ein einfaches OOP-System strukturieren | ||
* | = Aufgabenstellung = | ||
== Aufgabe 8.1 Abstrakte Klasse „Fahrzeug“ == | |||
Erstelle eine abstrakte Klasse '''Fahrzeug'''. | |||
=== Anforderungen === | |||
{| class="wikitable" | |||
|- | |||
| Eigenschaft: || <code>Geschwindigkeit</code> || nur innerhalb der Klasse zugänglich | |||
|- | |||
| Konstruktor: || <code>Fahrzeug()</code>|| setzt die Geschwindigkeit | |||
|- | |||
| Methode: || <code>getGeschwindigkeit()</code> || liest die Geschwindigkeit aus | |||
|- | |||
| Abstrakte Methode: || <code>info()</code> || liest die Informationen | |||
|} | |||
== Aufgabe 8.2 Klasse „Auto“ == | |||
Erstelle eine Klasse <code>Auto</code>, die von <code>Fahrzeug</code> erbt. | |||
=== Anforderungen === | |||
{| class="wikitable" | |||
|- | |||
| Eigenschaft: || <code>Marke</code> || | |||
|- | |||
| Konstruktor: || <code>Auto()</code>|| setzt Geschwindigkeit und Marke | |||
|- | |||
| Methode: || <code>getGeschwindigkeit()</code> || liest die Geschwindigkeit aus | |||
|- | |||
| Abstrakte Methode: || <code>info()</code> || liest die Informationen | |||
|} | |||
=== Beispielausgabe === | |||
*Auto: BMW | |||
*Geschwindigkeit: 180 km/h | |||
== Aufgabe 8.3 Klasse <code>Fahrrad</code> == | |||
Erstelle eine Klasse <code>Fahrrad</code>, die ebenfalls von <code>Fahrzeug</code> erbt. | |||
==== Anforderungen ==== | |||
{| class="wikitable" | |||
|- | |||
| Eigenschaft: || <code>Typ</code> || nur innerhalb der Klasse zugänglich, z. B. Mountainbike, Rennrad | |||
|- | |||
| Konstruktor: || <code>Fahrrad()</code>|| setzt Geschwindigkeit und Typ | |||
|- | |||
| Methode: || <code>getGeschwindigkeit()</code> || liest die Geschwindigkeit aus | |||
|- | |||
| Abstrakte Methode: || <code>info()</code> || liest die Informationen | |||
|} | |||
=== Beispielausgabe === | |||
*Fahrrad: Mountainbike | |||
*Geschwindigkeit: 25 km/h | |||
== Aufgabe 8.4 Hauptprogramm (Polymorphismus) == | |||
Erstelle ein Skript <code>main.m</code>. | |||
=== Aufgaben === | |||
* Erzeuge: | |||
*1 Auto | |||
*1 Fahrrad | |||
*Speichere beide in einer Liste/einem Array | |||
*Rufe für jedes Objekt die Methode <code>info()</code> auf | |||
== Aufgabe 8.5 Zusatzaufgabe == | |||
=== Aufgabe 8.5.1 Klasse „E-Bike“ === | |||
Erweitere das System um eine Klasse '''E-Bike''': | |||
Zusätzliche Eigenschaft: | |||
*Akkukapazität | |||
*überschreibt: <code>info()</code> | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong><code> | | <strong>Musterlösung <code>EBike.m</code> </strong> | ||
|- | |- | ||
| < | | | ||
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium"> | |||
properties | classdef EBike < Fahrzeug | ||
properties | |||
end | Akkukapazitaet | ||
end | |||
methods | |||
function obj = EBike(v, akku) | |||
obj@Fahrzeug(v); | |||
obj.Akkukapazitaet = akku; | |||
end | |||
function info(obj) | |||
fprintf("E-Bike\n"); | |||
fprintf("Geschwindigkeit: %.1f km/h\n", ... | |||
obj.Geschwindigkeit); | |||
fprintf("Akkukapazitaet: %.1f Wh\n", ... | |||
obj.Akkukapazitaet); | |||
end | |||
end | |||
end | end | ||
</syntaxhighlight> | |||
</ | |||
|} | |} | ||
=== Aufgabe 8.5.2 Kapselung erweitern === | |||
*Setze ''Geschwindigkeit'' auf '''private''' | |||
*Erstelle Methode: <code>setGeschwindigkeit(v)</code> | |||
* Validierung: Geschwindigkeit darf nicht negativ sein | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong>Musterlösung | | <strong>Musterlösung <code>Fahrzeug.m</code> </strong> | ||
|- | |- | ||
| < | | | ||
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium"> | |||
classdef (Abstract) Fahrzeug | |||
properties (Access = private) | |||
Geschwindigkeit | |||
end | end | ||
methods | |||
function obj = Fahrzeug(v) | |||
obj = obj.setGeschwindigkeit(v); | |||
end | |||
function obj = setGeschwindigkeit(obj, v) | |||
if v < 0 | |||
error("Geschwindigkeit darf nicht negativ sein."); | |||
end | |||
obj.Geschwindigkeit = v; | |||
end | |||
function v = getGeschwindigkeit(obj) | |||
v = obj.Geschwindigkeit; | |||
end | |||
end | end | ||
methods (Abstract) | |||
info(obj) | |||
end | end | ||
end | |||
</syntaxhighlight> | |||
end | |||
</ | |||
|} | |} | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong>Musterlösung | | <strong>Musterlösung <code>main.m</code> </strong> | ||
|- | |- | ||
| < | | | ||
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium"> | |||
clc;clear; | |||
a = Auto(180, "BMW"); | |||
f = Fahrrad(25, "Mountainbike"); | |||
e = EBike(30, 750); | |||
fahrzeuge = [a, f, e]; | |||
for k = 1:length(fahrzeuge) | |||
fahrzeuge(k).info(); | |||
fprintf("\n"); | |||
end | end | ||
</syntaxhighlight> | |||
|} | |||
</ | = Lernzielkontrolle = | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Warum ist die Klasse <code>Fahrzeug</code> abstrakt? </strong> | |||
|- | |||
| Die Klasse Fahrzeug ist abstrakt, weil sie kein konkretes Objekt beschreibt, sondern nur eine allgemeine Vorlage darstellt. | |||
|- | |||
| | |||
*Ein <code>Fahrzeug</code> an sich existiert nicht in der Realität als eindeutiges Objekt. | |||
*Es dient nur als gemeinsame Struktur für spezialisierte Klassen wie Auto oder Fahrrad. | |||
*Die abstrakte Methode <code>info()</code> erzwingt, dass jede Unterklasse ihre eigene Umsetzung liefert. | |||
|} | |} | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong> | | <strong>Wo wird Vererbung im Code sichtbar? </strong> | ||
|- | |- | ||
| < | | Vererbung wird in der Klassendeklaration sichtbar: | ||
</ | |- | ||
|<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium"> | |||
classdef Auto < Fahrzeug | |||
classdef Fahrrad < Fahrzeug | |||
</syntaxhighlight>. | |||
|- | |||
|Das bedeutet: | |||
* Auto und Fahrrad erben Eigenschaften und Methoden von Fahrzeug | |||
* z. B. <code>Geschwindigkeit</code> und <code>getGeschwindigkeit()</code> | |||
|- | |||
| | |||
Zusätzlich sichtbar im Konstruktor: | |||
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium"> | |||
obj@Fahrzeug(v) | |||
</syntaxhighlight> | |||
|} | |} | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong> | | <strong>Was bedeutet Polymorphismus im Hauptprogramm? </strong> | ||
|- | |||
| Polymorphismus bedeutet, dass dieselbe Methode unterschiedliche Verhaltensweisen haben kann. | |||
|- | |||
| | |||
Im Hauptprogramm: | |||
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium"> | |||
fahrzeuge = [auto, fahrrad]; | |||
for k = 1:length(fahrzeuge) | |||
fahrzeuge(k).info(); | |||
end | |||
</syntaxhighlight> | |||
|- | |- | ||
| < | | | ||
</ | Es wird immer die Methode info() aufgerufen<br> | ||
* <code>Auto.info()</code> gibt Auto-spezifische Informationen aus | |||
* <code>Fahrrad.info()</code> gibt Fahrrad-spezifische Informationen aus | |||
Gleicher Aufruf – unterschiedliches Verhalten | |||
|} | |} | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong> | | <strong>Warum ist Kapselung sinnvoll? </strong> | ||
|- | |- | ||
| < | | Kapselung schützt interne Daten und kontrolliert den Zugriff auf Objekteigenschaften. | ||
</ | |- | ||
| | |||
Beispiel: | |||
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium"> | |||
properties (Access = private) | |||
Geschwindigkeit | |||
end | |||
</syntaxhighlight> | |||
|- | |||
| | |||
Vorteile: | |||
* Daten können nicht unkontrolliert verändert werden | |||
* Validierung ist möglich (z. B. keine negative Geschwindigkeit) | |||
* interne Implementierung bleibt verborgen | |||
* externe Nutzung erfolgt nur über definierte Methoden | |||
|} | |} | ||
---- | ---- | ||
→ zurück zum Hauptartikel: [[BSE Modellierung und Simulation - | → [[MATLAB-Befehle| MATLAB<sup>®</sup> Befehlsübersicht]]<br> | ||
→ zurück zum Hauptartikel: [[BSE Modellierung und Simulation - SoSe26]] | |||
Aktuelle Version vom 28. Mai 2026, 12:22 Uhr
| Autor: | Prof. Dr.-Ing. Schneider |
| Termin: | 22.05.2026 |
Lernziel
Nach der Bearbeitung können die Studierenden:
- abstrakte Klassen in MATLAB® erstellen
- Vererbung anwenden
- private/protected Eigenschaften unterscheiden
- Polymorphismus praktisch einsetzen
- ein einfaches OOP-System strukturieren
Aufgabenstellung
Aufgabe 8.1 Abstrakte Klasse „Fahrzeug“
Erstelle eine abstrakte Klasse Fahrzeug.
Anforderungen
| Eigenschaft: | Geschwindigkeit |
nur innerhalb der Klasse zugänglich |
| Konstruktor: | Fahrzeug() |
setzt die Geschwindigkeit |
| Methode: | getGeschwindigkeit() |
liest die Geschwindigkeit aus |
| Abstrakte Methode: | info() |
liest die Informationen |
Aufgabe 8.2 Klasse „Auto“
Erstelle eine Klasse Auto, die von Fahrzeug erbt.
Anforderungen
| Eigenschaft: | Marke |
|
| Konstruktor: | Auto() |
setzt Geschwindigkeit und Marke |
| Methode: | getGeschwindigkeit() |
liest die Geschwindigkeit aus |
| Abstrakte Methode: | info() |
liest die Informationen |
Beispielausgabe
- Auto: BMW
- Geschwindigkeit: 180 km/h
Aufgabe 8.3 Klasse Fahrrad
Erstelle eine Klasse Fahrrad, die ebenfalls von Fahrzeug erbt.
Anforderungen
| Eigenschaft: | Typ |
nur innerhalb der Klasse zugänglich, z. B. Mountainbike, Rennrad |
| Konstruktor: | Fahrrad() |
setzt Geschwindigkeit und Typ |
| Methode: | getGeschwindigkeit() |
liest die Geschwindigkeit aus |
| Abstrakte Methode: | info() |
liest die Informationen |
Beispielausgabe
- Fahrrad: Mountainbike
- Geschwindigkeit: 25 km/h
Aufgabe 8.4 Hauptprogramm (Polymorphismus)
Erstelle ein Skript main.m.
Aufgaben
- Erzeuge:
- 1 Auto
- 1 Fahrrad
- Speichere beide in einer Liste/einem Array
- Rufe für jedes Objekt die Methode
info()auf
Aufgabe 8.5 Zusatzaufgabe
Aufgabe 8.5.1 Klasse „E-Bike“
Erweitere das System um eine Klasse E-Bike:
Zusätzliche Eigenschaft:
- Akkukapazität
- überschreibt:
info()
Musterlösung EBike.m
|
classdef EBike < Fahrzeug
properties
Akkukapazitaet
end
methods
function obj = EBike(v, akku)
obj@Fahrzeug(v);
obj.Akkukapazitaet = akku;
end
function info(obj)
fprintf("E-Bike\n");
fprintf("Geschwindigkeit: %.1f km/h\n", ...
obj.Geschwindigkeit);
fprintf("Akkukapazitaet: %.1f Wh\n", ...
obj.Akkukapazitaet);
end
end
end
|
Aufgabe 8.5.2 Kapselung erweitern
- Setze Geschwindigkeit auf private
- Erstelle Methode:
setGeschwindigkeit(v) - Validierung: Geschwindigkeit darf nicht negativ sein
Musterlösung Fahrzeug.m
|
classdef (Abstract) Fahrzeug
properties (Access = private)
Geschwindigkeit
end
methods
function obj = Fahrzeug(v)
obj = obj.setGeschwindigkeit(v);
end
function obj = setGeschwindigkeit(obj, v)
if v < 0
error("Geschwindigkeit darf nicht negativ sein.");
end
obj.Geschwindigkeit = v;
end
function v = getGeschwindigkeit(obj)
v = obj.Geschwindigkeit;
end
end
methods (Abstract)
info(obj)
end
end
|
Musterlösung main.m
|
clc;clear;
a = Auto(180, "BMW");
f = Fahrrad(25, "Mountainbike");
e = EBike(30, 750);
fahrzeuge = [a, f, e];
for k = 1:length(fahrzeuge)
fahrzeuge(k).info();
fprintf("\n");
end
|
Lernzielkontrolle
Warum ist die Klasse Fahrzeug abstrakt?
|
| Die Klasse Fahrzeug ist abstrakt, weil sie kein konkretes Objekt beschreibt, sondern nur eine allgemeine Vorlage darstellt. |
|
| Wo wird Vererbung im Code sichtbar? |
| Vererbung wird in der Klassendeklaration sichtbar: |
classdef Auto < Fahrzeug
classdef Fahrrad < Fahrzeug
|
Das bedeutet:
|
|
Zusätzlich sichtbar im Konstruktor: obj@Fahrzeug(v)
|
| Was bedeutet Polymorphismus im Hauptprogramm? |
| Polymorphismus bedeutet, dass dieselbe Methode unterschiedliche Verhaltensweisen haben kann. |
|
Im Hauptprogramm: fahrzeuge = [auto, fahrrad];
for k = 1:length(fahrzeuge)
fahrzeuge(k).info();
end
|
|
Es wird immer die Methode info() aufgerufen
Gleicher Aufruf – unterschiedliches Verhalten |
| Warum ist Kapselung sinnvoll? |
| Kapselung schützt interne Daten und kontrolliert den Zugriff auf Objekteigenschaften. |
|
Beispiel: properties (Access = private)
Geschwindigkeit
end
|
|
Vorteile:
|
→ MATLAB® Befehlsübersicht
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe26