WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

1:n Beziehung / Komposition (Auto-Rad)

 

Anfänger_OOP

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2016, 13:11     Titel: 1:n Beziehung / Komposition (Auto-Rad)
  Antworten mit Zitat      
Hallo Zusammen,

ich bin kompletter Anfänger in der OOP in Matlab und komme direkt bei der Definition meiner Klassen nicht weiter.

Und zwar das Problem ist, dass ich 3 Klassen anlegen möchte - Auto, Rad, Winterketten - die in bestimmten Verhältnissen zu einander stehen.

So besitzt 1 Auto ingesamt 4 Reifen, und 1 Reifen wiederum 1 Winterkette. Wie kann ich diese 1:n / 1:1 Beziehungen in der Klassendefinition realisieren?

Mein Vorgehen war, dass ich meinen einzelnen Objekten eine ID zuweise, und anhand dieser ID wiederum, die Beziehung zwischen den Klassen/Objekten definiere. In etwa für die Klasse Auto also die properties:

numReifen
Reifen [numReifen] (<-- Array aus Objekten)

und wenn ich dann ein Objekt erzeuge, dann zuweise

numReifen = 4;
Reifen [4] = [ID1Reifen, ID1Reifen, ID1Reifen, ID1Reifen]

In meinem Beispiel würde es von der Klasse Reifen 2 Objekte geben (Winter- und Sommerreifen), die ebenden ID1Reifen und ID2Reifen besitzen. Ebenso könnte man festlegen ob das Auto wirklich 4 Reifen hat oder eventuell mehr (Limousine oder so...)

Zusammenfassend hatte ich mir gedacht, dass ich also jedes Objekt indiziere und die Indizierung in ein Array aus Objekten packe um die Komposition Auto-Reifen hin zu bekommen.
Kann man das überhaupt machen? Falls ja, wie könnte der Programm Code ausschauen? Falls nein, wie kann man eine Komposition bzw. eine 1:n Beziehung zwsichen Klassen in Matlab realisieren?

Vielen Dank und Frohe Ostern!


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.03.2016, 13:58     Titel:
  Antworten mit Zitat      
Hallo,

klingt soweit gut.

Code:


In der Konstruktormethode und den Methoden, die car-Objekte verändern, sollte dann darauf geachtet werden, dass Tires immer ein 1xnumTires Array von Reifen-Objekten ist.

Siehe auch
http://de.mathworks.com/help/matlab.....ssets-in-a-portfolio.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Anfänger_OOP

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.03.2016, 21:19     Titel:
  Antworten mit Zitat      
Danke für deine Antwort Harald. Aber wie kann ich es denn genau im Code festlegen, dass er mir für jedes Objekt der Klasse Auto, automatisch eine bestimmte, vom User angegebene, Anzahl bestimmter Objekte der Klasse Rad anlegt?

Code:
%

classdef car

properties
numTires
Tires = {}  % soll ein numTires x 1 Array sein
end
 
method
function obj = createTires (obj,numTires)
for k = i:numTires
obj.Tires = %???
end

end


Irgendwie so hatte ich mir das gedacht, aber ich komm da nicht so recht weiter. Ich habe einfach nicht so wirklich Ahnung die genau meine Methode aussehen muss... Kannst du mir da behilflich sein?

Zur Info. Meine andere Klasse Reifen sieht so aus:

Code:
%
classdef Tires

properties
type % Sommer oder Winterreifen
end

end

 


Ich bedanke mich schonmal im Vorraus Smile

Schönen Abend noch!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.03.2016, 22:54     Titel:
  Antworten mit Zitat      
Hallo,

etwa so:
Code:
classdef car

properties
numTires
Tires = [];  % soll ein numTires x 1 Array sein
end
 
method
function obj = createTires (obj)
for k = 1:obj.numTires
obj.Tires(k) = Tires(   ); % Aufruf des Konstruktors von Tires mit passenden Argumenten
end

end


Ein komplett ausgearbeitetes Beispiel ist im Link in der Doku.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Anfänger_OOP

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2016, 18:33     Titel:
  Antworten mit Zitat      
Danke Harald. Ich habe jetzt folgendes gemacht:

Code:


classdef Car

properties
Bauteil = Tire  % Tire ist die andere Klasse
numTire
end

methods
function obj= Car()
            obj.Baiteil = Tire();
end

function obj= createTire(obj)
            i = obj.numTire;
            obj.Bauteil(i) = Tire();
end

end
 


Jetzt funktioniert es soweit, dass er durch die function createTire mir ein 1xnumTire Array anlegt für die property "Bauteil".

Allerdings legt er mir neben meinem Objekt "Auto" beum Ausführen von createTire ein Objekt "ans" an. "ans" besitzt das besagte 1xnumTire Array. Allerdings besitzt mein eigentliches Objekt "Auto" immer noch ein 1x1 Array. An was liegt das? wie kann ich dieses "ans" umgehen?

Weitere Frage: Wenn es nun 2 vordefinierte Objekte der Klasse Tire gibt, also sagen wir Objekt "Winterreifen" und Objekt "Sommerreifen". Wie kann ich dann implementieren, dass er das erzeugte 1xnumTire Array einmal mit den Objekten "Winterreifen" und einmal mit den Objekten "Sommerreifen" füllt? Sozusagen, dass mir mein Programm 2 Kombinationen auswirft: Auto-Sommerreifen und Auto-Winterreifen? Von denen ich dann im Anschluss die Parameter wie Masse oder ähnliches berechnen und vergleichen möchte...

Verständlich meine Fragestellung? Smile

Danke auf jedenfall schonmal!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.03.2016, 19:16     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Allerdings legt er mir neben meinem Objekt "Auto" beum Ausführen von createTire ein Objekt "ans" an. "ans" besitzt das besagte 1xnumTire Array. Allerdings besitzt mein eigentliches Objekt "Auto" immer noch ein 1x1 Array. An was liegt das? wie kann ich dieses "ans" umgehen?

Ich vermute einen fehlerhaften Aufruf der Methode. Bei Value Classes muss immer das aktualisierte Objekt zurückgegeben werden.
Code:
myCar = Car;
myCar = createTire(myCar);

Zitat:

Weitere Frage: Wenn es nun 2 vordefinierte Objekte der Klasse Tire gibt, also sagen wir Objekt "Winterreifen" und Objekt "Sommerreifen". Wie kann ich dann implementieren, dass er das erzeugte 1xnumTire Array einmal mit den Objekten "Winterreifen" und einmal mit den Objekten "Sommerreifen" füllt? Sozusagen, dass mir mein Programm 2 Kombinationen auswirft: Auto-Sommerreifen und Auto-Winterreifen? Von denen ich dann im Anschluss die Parameter wie Masse oder ähnliches berechnen und vergleichen möchte...

Ich würde diese Information in createTire entgegennehmen und dann an Tire durchreichen.
Code:
function obj= createTire(obj, type)
            i = obj.numTire;
            obj.Bauteil(i) = Tire(type);
end

Der Konstruktor von Tire muss natürlich darauf ausgelegt sein.

Falls die Reifentypen viele (unterschiedliche) Eigenschaften haben, würde es sich auch anbieten, zwei Klassen Winterreifen und Sommerreifen von einer Klasse Reifen zu vererben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Anfänger_OOP

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2016, 18:15     Titel:
  Antworten mit Zitat      
Danke Harald. Aber wie meinst du das der Konstruktor muss darauf ausgelegt sein? Ich glaube genau hier liegt mein Problem. Könntest du mir das zeigen wie der Konstruktor von Tire dann ausschauen müsste??

Danke!!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.04.2016, 23:02     Titel:
  Antworten mit Zitat      
Hallo,

etwa so:
Code:
classdef Tires

properties
type % Sommer oder Winterreifen
end

methods

function obj = Tires(type)
if nargin > 0
obj.type = type;
end
end

end

end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Anfänger_OOP

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2016, 10:57     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort. Was mir jetzt allerdings immer noch nicht ganz klar ist, wie der Code dann alle möglichen Konfigurationen erzeugt. Und wenn ich den Code richtig verstehe, dann erzeugt er ja neue Objekte der Klasse Tire.

Ich möchte gerne, dass er aus bereits definierten Objekten der Klasse Tire alle möglichen Kombination auswählt (je nach Bedingung).

Sagen wir, dass Auto hat noch die Eigenschaft "Tauglichkeit", mit den möglichen Werten "Winter", "Sommer", "Ganzjährig".

Nun soll die Methode in der Klasse Auto durch die Überprüfung der "Tauglichkeit", die passenden Reifen zuordnen.

Also Tauglichkeit = Winter, dann Reifen vom type = Winterreifen
Tauglichkeit = Sommer, dann Reifen vom type = Sommerreifen
Tauglichkeit = Ganzjährig, dann Reifen vom type = Sommerreifen oder Winterreifen.

Also je nach Fallunterscheidung, soll er mir die passenden Reifen zuordnen. Mein Ansatz war, dass ich alle Objekte der Klasse Reifen in einer Liste speicher.

AlleReifen = [Winterreifen Sommerreifen]

um dann nach Fall auf die jeweiligen Reifen zuzugreifen.


Um im Code den Unterschied zwischen der Klasse Reifen und der Eigenschaft Reifen zu verdeutlichen, habe ich nun für die Eigenschaft das Wort Reifen benutzt, und für die Klasse das Wort Tire.


Code:
% Klasse Car

properties
Reifen = Tire();
numReifen
Tauglichkeit
end

method
function obj = setReifen (obj)
obj.Reifen(obj.numReifen) = Tire();  % Erstellen von 1xnumReifen Array
switch obj.Tauglichkeit
case 'Winter'
for i=1:length(obj.numReifen)  % Jeden Reifen einzeln bestimmen
obj.Reifen(i) = set (obj.Reifen(i),MoeglicheReifen)
MoeglicheReifen = AlleReifen(1);
% Funktioniert das, so greife ich ja nicht auf eine Methode in der Klasse Tire zu oder? Weil wenn ich nicht ein neues Objekt Reifen erzeugen will, sondern auf ein bestehendes zugreifen möchte, dann muss ich ja eigentlich nichts in der Konstruktor Methode der Klasse Tire machen??
case 'Sommer'
for i=1:length(obj.numReifen)  % Jeden Reifen einzeln bestimmen
obj.Reifen(i) = set(obj.Reifen(i),MoeglicheReifen)
MoeglicheReifen = AlleReifen (2);
case 'Ganzjährig'
for i=1:length(obj.numReifen)  % Jeden Reifen einzeln bestimmen
obj.Reifen(i) = set(obj.Reifen(i),MoeglicheReifen)
MoeglicheReifen = AlleReifen (1,2); % Hier soll abgebildet werden, dass jeder einzelne der 4 Reifen entweder ein Sommer- oder Winterreifen ist. Das heißt, in diesem Fall soll es auch zulässig sein 1 Auto mit 2 Sommer- und 2 Winterreifen zu erzeugen
end

 


Als Ergebnis des Codes soll er mir dann alle möglichen Konfigurationen ausgeben

Winterauto - Winterreifen, Winterreifen, Winterreifen, Winterreifen
Sommerauto - Sommerreifen, Sommerreifen, Sommerreifen, Sommerreifen
Ganzjährigesautor - Winterreifen, Winterreifen, Winterreifen, Winterreifen
ODER Sommerreifen, Sommerreifen, Sommerreifen, Sommerreifen
ODER Winterreifen, Winterreifen, Winterreifen, Sommerreifen
....

Diese Konfigurationen möchte ich wiederrum miteinander vergleichen. Also am Besten jede entstandene Konfiguration aus Auto und Reifen speichern, um dann bestimmte Parameter neu zu berechen. (Bsp jedes Auto hat ein bestimmtes Gewicht, jeder Reifen hat ein bestimmtes Gewicht --> Berechnen der Gesamtmasse aller Konfigurationen um dann zu sagen, welche Konfiguration ist die leichteste).

Was genau fehlt in diesem Code, dass er mir alle, diese möglichen Konfigurationen abspeichert.
 
Anfänger_OOP

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2016, 12:50     Titel:
  Antworten mit Zitat      
Noch eine Anmerkung zu obigen Code, habe da ausversehen einige Fehler eingebaut.

Code:

% Klasse Car

properties
Reifen = Tire();
numReifen
Tauglichkeit
end

method
function obj = setReifen (obj)
obj.Reifen(obj.numReifen) = Tire();  % Erstellen von 1xnumReifen Array
switch obj.Tauglichkeit
case 'Winter'
for i=1:length(obj.numReifen)  % Jeden Reifen einzeln bestimmen
MoeglicheReifen = AlleReifen(1,1);
obj.Reifen(i) = MoeglicheReifen;
% Funktioniert das, so greife ich ja nicht auf eine Methode in der Klasse Tire zu oder? Weil wenn ich nicht ein neues Objekt Reifen erzeugen will, sondern auf ein bestehendes zugreifen möchte, dann muss ich ja eigentlich nichts in der Konstruktor Methode der Klasse Tire machen??
case 'Sommer'
for i=1:length(obj.numReifen)  % Jeden Reifen einzeln bestimmen
MoeglicheReifen = AlleReifen(1,2);
obj.Reifen(i) = MoeglicheReifen;
case 'Ganzjährig'
for i=1:length(obj.numReifen)  % Jeden Reifen einzeln bestimmen
MoeglicheReifen = AlleReifen(); % Hier soll abgebildet werden, dass jeder einzelne der 4 Reifen entweder ein Sommer- oder Winterreifen ist. Das heißt, in diesem Fall soll es auch zulässig sein 1 Auto mit 2 Sommer- und 2 Winterreifen zu erzeugen
end
obj.Reifen(i) = MoeglicheReifen;
 


Nun greife ich nicht mehr auf den Konstruktor von Klasse Tire zu und erzeuge keine neuen Objekte der Klasse Tire, sondern bediene mich an den bereits vordefinierten Objekten.
Problem ist nun allerdings, dass ich nicht weiß wie deklarieren kann, dass mehrere Reifentypen zulässig sind (siehe Auto Ganzjaehrig). In diesem Fall ist mir dann auch nicht klar, wie ich mir alle verschiedenen Konfigurationen abspeichern kann und vergleichen kann (siehe letzten Post).

Danke im Vorraus und für deine bisherigen Mühen!!
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.