Modellierung und Simulation - Objektorientierte Programmierung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(18 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:''' || 23.05.2025
| '''Termin:''' || 22.05.2026
|}
|}
= Lernziel =
= Lernziel =
Zeile 20: Zeile 20:
{| class="wikitable"
{| class="wikitable"
|-
|-
| Eigenschaft
| Eigenschaft: || <code>Geschwindigkeit</code> || nur innerhalb der Klasse zugänglich
: || <code>Geschwindigkeit</code> || nur innerhalb der Klasse zugänglich
|-
|-
| Konstruktor: || Beispiel || setzt die Geschwindigkeit
| Konstruktor: || <code>Fahrzeug()</code>|| setzt die Geschwindigkeit
|-
|-
| Methode: || <code>getGeschwindigkeit()</code> || liest die Geschwindigkeit aus
| Methode: || <code>getGeschwindigkeit()</code> || liest die Geschwindigkeit aus
Zeile 30: Zeile 29:
|}
|}


== 2. Klasse „Auto“ ==
== Aufgabe 8.2 Klasse „Auto“ ==
Erstelle eine Klasse <code>Auto</code>, die von <code>Fahrzeug</code> erbt.


Erstelle eine Klasse '''Auto''', die von ''Fahrzeug'' 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
|}


==== Eigenschaften ====
=== Beispielausgabe ===
*Auto: BMW
*Geschwindigkeit: 180&thinsp;km/h


Marke
== Aufgabe 8.3 Klasse <code>Fahrrad</code> ==
Erstelle eine Klasse <code>Fahrrad</code>, die ebenfalls von <code>Fahrzeug</code> erbt.


==== Anforderungen ====
==== Anforderungen ====
{| class="wikitable"
|-
| Eigenschaft: || <code>Typ</code> || nur innerhalb der Klasse zugänglich, z.&thinsp;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&thinsp;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


Konstruktor:
== Aufgabe 8.5 Zusatzaufgabe  ==
setzt Geschwindigkeit und Marke
Implementiere:
''info()''


==== Beispielausgabe ====
=== Aufgabe 8.5.1 Klasse „E-Bike“ ===
Auto: BMW
Erweitere das System um eine Klasse '''E-Bike''':
Geschwindigkeit: 180 km/h


=== 3. Klasse „Fahrrad“ ===
Zusätzliche Eigenschaft:
*Akkukapazität
*überschreibt: <code>info()</code>
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung <code>EBike.m</code>&thinsp;</strong>
|-
|
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
classdef EBike < Fahrzeug


Erstelle eine Klasse '''Fahrrad''', die ebenfalls von ''Fahrzeug'' erbt.
    properties
        Akkukapazitaet
    end


==== Eigenschaften ====
    methods


Typ (z. B. Mountainbike, Rennrad)
        function obj = EBike(v, akku)


==== Anforderungen ====
            obj@Fahrzeug(v);


Konstruktor:
            obj.Akkukapazitaet = akku;
setzt Geschwindigkeit und Typ
        end
Implementiere:
''info()''


==== Beispielausgabe ====
        function info(obj)
Fahrrad: Mountainbike
Geschwindigkeit: 25 km/h


=== 4. Hauptprogramm (Polymorphismus) ===
            fprintf("E-Bike\n");
            fprintf("Geschwindigkeit: %.1f km/h\n", ...
                obj.Geschwindigkeit);


Erstelle ein Skript '''main.m'''.
            fprintf("Akkukapazitaet: %.1f Wh\n", ...
                obj.Akkukapazitaet);
        end
    end
end
</syntaxhighlight>
|}


==== Aufgaben ====
=== 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"
| <strong>Musterlösung <code>Fahrzeug.m</code>&thinsp;</strong>
|-
|
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
classdef (Abstract) Fahrzeug


Erzeuge:
    properties (Access = private)
1 Auto
        Geschwindigkeit
1 Fahrrad
    end
Speichere beide in einer Liste / einem Array
Rufe für jedes Objekt die Methode ''info()'' auf


== 💡 Zusatzaufgabe (optional) ==
    methods
        function obj = Fahrzeug(v)
            obj = obj.setGeschwindigkeit(v);
        end


=== a) Klasse „E-Bike“ ===
        function obj = setGeschwindigkeit(obj, v)
Erweitere das System um eine Klasse '''E-Bike''':
            if v < 0
                error("Geschwindigkeit darf nicht negativ sein.");
            end
            obj.Geschwindigkeit = v;
        end


zusätzliche Eigenschaft:
        function v = getGeschwindigkeit(obj)
Akkukapazität
            v = obj.Geschwindigkeit;
überschreibt:
        end
''info()''
    end


=== b) Kapselung erweitern ===
    methods (Abstract)
        info(obj)
    end
end
</syntaxhighlight>
|}


Setze ''Geschwindigkeit'' auf '''private'''
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
Erstelle Methode:
| <strong>Musterlösung <code>main.m</code>&thinsp;</strong>
setGeschwindigkeit(v)
|-
Validierung:
|
Geschwindigkeit darf nicht negativ sein
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
clc;clear;


== 🧠 Leitfragen ==
a = Auto(180, "BMW");


Warum ist die Klasse ''Fahrzeug'' abstrakt?
f = Fahrrad(25, "Mountainbike");
Wo wird Vererbung im Code sichtbar?
Was bedeutet Polymorphismus im Hauptprogramm?
Warum ist Kapselung sinnvoll?
Was passiert ohne Getter/Setter?


== 📊 Erwartetes Ergebnis (Polymorphismus) ==
e = EBike(30, 750);


fahrzeuge = [auto, fahrrad];
fahrzeuge = [a, f, e];


for k = 1:length(fahrzeuge)
for k = 1:length(fahrzeuge)
fahrzeuge(k).info();
end


→ gleiche Methode ''info()'', aber unterschiedliche Ausgabe
    fahrzeuge(k).info();


== 🧾 Lernziel ==
    fprintf("\n");
 
end
Nach der Bearbeitung können die Studierenden:
</syntaxhighlight>
|}


abstrakte Klassen in MATLAB erstellen
= Lernzielkontrolle =
Vererbung anwenden
private/protected Eigenschaften unterscheiden
Polymorphismus praktisch einsetzen
ein einfaches OOP-System strukturieren
<!--
=Aufgabe 9.1 Strukturen und Klassen=
Erstellen Sie den <code>struct person</code> mit den Datenfeldern:
* Strasse,
* Hausnummer,
* Postleitzahl,
* Ort,
* Geburtsdatum [Array aus 3 Zahlen].
Legen Sie 3 Personen an.
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 9.1&thinsp;</strong>
| <strong>Warum ist die Klasse <code>Fahrzeug</code> abstrakt?&thinsp;</strong>
|-
| Die Klasse Fahrzeug ist abstrakt, weil sie kein konkretes Objekt beschreibt, sondern nur eine allgemeine Vorlage darstellt.
|-
|-
| <source line lang="matlab" style="font-size:medium">person = struct( 'Name', 'Hannah', ...
|
'Telnr', '0815', ...
*Ein <code>Fahrzeug</code> an sich existiert nicht in der Realität als eindeutiges Objekt.
'Strasse', 'Hamb. Str.', ...
*Es dient nur als gemeinsame Struktur für spezialisierte Klassen wie Auto oder Fahrrad.
'Hausnr', 75,...
*Die abstrakte Methode <code>info()</code> erzwingt, dass jede Unterklasse ihre eigene Umsetzung liefert.
'Postleitzahl',59555,...
'Ort','Lippstadt',...
'Geburtsdatum',[1,1,1920]  );
</source>
|}
|}
=Aufgabe 9.2 Strukturen und Klassen=
Schreiben wir eine Funktion <code>getPerson</code> die nacheinander Daten für mehrere Personen einliest, diesmal nur mit den beiden Feldern <code>Name</code> und <code>Telnr</code>. In einer
Schleife werden die Werte für diese Felder von der Tastatur eingelesen, und zwar nacheinander für das erste Element person(n), n = 1, bis zur übergebenen Maximalzahl
num_pers, im Beispielaufruf gleich 3. Das so erzeugte struct-Array person wird von der Funktion zurückgegeben.


{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 9.2&thinsp;</strong>
| <strong>Wo wird Vererbung im Code sichtbar?&thinsp;</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.&thinsp;B. <code>Geschwindigkeit</code> und <code>getGeschwindigkeit()</code>
|-
|-
| <source line lang="matlab" style="font-size:medium">%
|
%  pers = Array mit Elementen der Klasse Person
Zusätzlich sichtbar im Konstruktor:
%
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
function pers = getPerson( anz )
obj@Fahrzeug(v)
  for( n = 1:anz )    % Einleseschleife: von 1 bis anz
</syntaxhighlight>
    name  = input( 'Name: ', 's' );    % als Text
 
    telnr = input( 'Tel.-Nr.: ' );    % als Zahl
    str  = input( 'Strasse: ', 's' );    % als Text
    hnr  = input( 'Haus.-Nr.: ' );    % als Zahl
    plz  = input( 'PLZ: ' );    % als Zahl
    ort  = input( 'Ort: ', 's' );    % als Text
    % neues n-tes Objekt von Person
    pers(n) = Person( name, telnr, str, hnr, plz, ort ); 
  end
end
</source>
|}
|}


=Aufgabe 9.3 Strukturen und Klassen=
Stellen Sie den Struct Person auf eine Klasse um. Schreiben Sie die Funktionen <code>printPerson</code>, welche die Übergabeklasse <code>Person</code> im Command Window ausgibt.
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 9.3&thinsp;</strong>
| <strong>Was bedeutet Polymorphismus im Hauptprogramm?&thinsp;</strong>
|-
| Polymorphismus bedeutet, dass dieselbe Methode unterschiedliche Verhaltensweisen haben kann.
|-
|-
| <source line lang="matlab" style="font-size:medium">%
|
%  pers = Array mit Elementen der Klasse Person
Im Hauptprogramm:
%
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
function printPerson( pers )
fahrzeuge = [auto, fahrrad];
  anz = length( pers );          % Zahl der Personen
  fprintf( '\nMeine Freunde : \n' );   % Überschrift
  fprintf(  '---------------\n' );
  for( n = 1:anz )                % Ausgabeschleife
    pers(n).print;
  end 
end


</source>
for k = 1:length(fahrzeuge)
 
    fahrzeuge(k).info();
classdef Person
% Eigenschaften
properties
name = '';
telnr = 0;
end % properties
% Methoden
methods
% Konstruktor
function o = Person( name, telnr )
o.name = name;
o.telnr = telnr;
end
end
function print( o )
</syntaxhighlight>
fprintf( 'Name: %s, Tel.Nr.: %g.\n', ...
|-
o.name, o.telnr );
|
end
Es wird immer die Methode info() aufgerufen<br>
function info( o )
* <code>Auto.info()</code> gibt Auto-spezifische Informationen aus
fprintf( 'Telefonnummer %g gehört zu %s.\n', ...
* <code>Fahrrad.info()</code> gibt Fahrrad-spezifische Informationen aus
o.telnr, o.name );
Gleicher Aufruf – unterschiedliches Verhalten
end
end % methods
end % classdef
|}
|}
=Aufgabe 9.4 Strukturen und Klassen=
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung 9.3&thinsp;</strong>
| <strong>Warum ist Kapselung sinnvoll?&thinsp;</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>
|-
|-
| <source line lang="matlab" style="font-size:medium">
|
</source>
Vorteile:
* Daten können nicht unkontrolliert verändert werden
* Validierung ist möglich (z.&thinsp;B. keine negative Geschwindigkeit)
* interne Implementierung bleibt verborgen
* externe Nutzung erfolgt nur über definierte Methoden
|}
|}
=Aufgabe 9.5 Strukturen und Klassen=


{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
 
| <strong>Musterlösung 9.5&thinsp;</strong>
|-
| <source line lang="matlab" style="font-size:medium">
</source>
|}
-->


----
----
→ [[MATLAB-Befehle| MATLAB<sup>®</sup> Befehlsübersicht]]<br>
→ [[MATLAB-Befehle| MATLAB<sup>®</sup> Befehlsübersicht]]<br>
→ zurück zum Hauptartikel: [[BSE Modellierung und Simulation - SoSe26]]
→ 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()

Aufgabe 8.5.2 Kapselung erweitern

  • Setze Geschwindigkeit auf private
  • Erstelle Methode: setGeschwindigkeit(v)
  • Validierung: Geschwindigkeit darf nicht negativ sein

Lernzielkontrolle



MATLAB® Befehlsübersicht
→ zurück zum Hauptartikel: BSE Modellierung und Simulation - SoSe26