Modellierung und Simulation - Objektorientierte Programmierung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 54: Zeile 54:
{| class="wikitable"
{| class="wikitable"
|-
|-
| Eigenschaft: || <code>Typ</code> || nur innerhalb der Klasse zugänglich, z. B. Mountainbike, Rennrad
| Eigenschaft: || <code>Typ</code> || nur innerhalb der Klasse zugänglich, z.&thinsp;B. Mountainbike, Rennrad
|-
|-
| Konstruktor: || <code>Fahrrad()</code>|| setzt Geschwindigkeit und Typ
| Konstruktor: || <code>Fahrrad()</code>|| setzt Geschwindigkeit und Typ
Zeile 86: Zeile 86:
*Akkukapazität
*Akkukapazität
*überschreibt: <code>info()</code>
*ü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
    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
</syntaxhighlight>
|}


=== Aufgabe 8.5.2 Kapselung erweitern ===
=== Aufgabe 8.5.2 Kapselung erweitern ===
*Setze ''Geschwindigkeit'' auf '''private'''
*Setze ''Geschwindigkeit'' auf '''private'''
*Erstelle Methode: <code>setGeschwindigkeit(v)</code>
*Erstelle Methode: <code>setGeschwindigkeit(v)</code>
* Validierung: Geschwindigkeit darf nicht negativ sein
* 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
    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
</syntaxhighlight>
|}
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung <code>main.m</code>&thinsp;</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
</syntaxhighlight>
|}


= Lernzielkontrolle =
= Lernzielkontrolle =
Zeile 117: Zeile 207:
|Das bedeutet:
|Das bedeutet:
* Auto und Fahrrad erben Eigenschaften und Methoden von Fahrzeug
* Auto und Fahrrad erben Eigenschaften und Methoden von Fahrzeug
* z.&thinso;B. <code>Geschwindigkeit</code> und <code>getGeschwindigkeit()</code>
* z.&thinsp;B. <code>Geschwindigkeit</code> und <code>getGeschwindigkeit()</code>
|-
|-
|
|
Zeile 123: Zeile 213:
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
obj@Fahrzeug(v)
obj@Fahrzeug(v)
</syntaxhighlight>.
</syntaxhighlight>


|}
|}
Zeile 130: Zeile 220:
| <strong>Was bedeutet Polymorphismus im Hauptprogramm?&thinsp;</strong>
| <strong>Was bedeutet Polymorphismus im Hauptprogramm?&thinsp;</strong>
|-
|-
| Die Klasse Fahrzeug ist abstrakt, weil sie kein konkretes Objekt beschreibt, sondern nur eine allgemeine Vorlage darstellt.
| Polymorphismus bedeutet, dass dieselbe Methode unterschiedliche Verhaltensweisen haben kann.
|-
|
*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"
| <strong>Warum ist Kapselung sinnvoll?&thinsp;</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.
Im Hauptprogramm:
*Es dient nur als gemeinsame Struktur für spezialisierte Klassen wie Auto oder Fahrrad.
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
*Die abstrakte Methode <code>info()</code> erzwingt, dass jede Unterklasse ihre eigene Umsetzung liefert.
|}
 
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Ergebnis (Polymorphismus)&thinsp;</strong>
|-
|<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
fahrzeuge = [auto, fahrrad];
fahrzeuge = [auto, fahrrad];


for k = 1:length(fahrzeuge)
for k = 1:length(fahrzeuge)
fahrzeuge(k).info();
    fahrzeuge(k).info();
end
end
</syntaxhighlight>
</syntaxhighlight>
|-
|-
|→ gleiche Methode ''info()'', aber unterschiedliche Ausgabe
|
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
|}
|}
<!--
=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 Kapselung sinnvoll?&thinsp;</strong>
|-
|-
| <source line lang="matlab" style="font-size:medium">person = struct( 'Name', 'Hannah', ...
| Kapselung schützt interne Daten und kontrolliert den Zugriff auf Objekteigenschaften.
'Telnr', '0815', ...
'Strasse', 'Hamb. Str.', ...
'Hausnr', 75,...
'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"
| <strong>Musterlösung 9.2&thinsp;</strong>
|-
|-
| <source line lang="matlab" style="font-size:medium">%
|
%  pers = Array mit Elementen der Klasse Person
Beispiel:
%
<syntaxhighlight lang="matlab" line style="border: none; background-color: #EFF1C1; font-size:medium">
function pers = getPerson( anz )
properties (Access = private)
  for( n = 1:anz )    % Einleseschleife: von 1 bis anz
     Geschwindigkeit
    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
end
</source>
</syntaxhighlight>
|}
 
=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"
| <strong>Musterlösung 9.3&thinsp;</strong>
|-
|-
| <source line lang="matlab" style="font-size:medium">%
|
%  pers = Array mit Elementen der Klasse Person
Vorteile:
%
* Daten können nicht unkontrolliert verändert werden
function printPerson( pers )
* Validierung ist möglich (z.&thinsp;B. keine negative Geschwindigkeit)
  anz = length( pers );          % Zahl der Personen
* interne Implementierung bleibt verborgen
  fprintf( '\nMeine Freunde : \n' );  % Überschrift
* externe Nutzung erfolgt nur über definierte Methoden
  fprintf(  '---------------\n' );
  for( n = 1:anz )                % Ausgabeschleife
    pers(n).print;
  end 
end
 
</source>
 
classdef Person
% Eigenschaften
properties
name = '';
telnr = 0;
end % properties
% Methoden
methods
% Konstruktor
function o = Person( name, telnr )
o.name = name;
o.telnr = telnr;
end
function print( o )
fprintf( 'Name: %s, Tel.Nr.: %g.\n', ...
o.name, o.telnr );
end
function info( o )
fprintf( 'Telefonnummer %g gehört zu %s.\n', ...
o.telnr, o.name );
end
end % methods
end % classdef
|}
|}


=Aufgabe 9.4 Strukturen und Klassen=


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