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

Variablen von Superklasse in Unterklasse benutzen

 

MarekJosef
Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 10.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2013, 10:49     Titel: Variablen von Superklasse in Unterklasse benutzen
  Antworten mit Zitat      
Hallo!

Ich habe folgendes Problem: ich habe zwei Klassen "A" und "B", A ist die Superklasse von B. Ich möchte jetzt in B Methoden definieren, welche Properties aus A benutzt. Folgendes habe ich programmiert (gekürzt auf das wesentliche):

Code:

%Datei "A.m"
classdef A  
    properties
         EigenschaftA
    end
end

%Datei "B.m"
classdef B  < A
    properties
         EigenschaftB
         EigenschaftB2
    end
   
    methods
         function obj = Berechne(obj, EigenschaftA)
                 %Das ist jetzt nur eine Beispielsberechnung
                 obj.EigenschaftB2 = obj.EigenschaftB + EigenschaftA;
         end
    end  
end

 


Ich denke mir, mein Problem liegt in der Objekterzeugung. Dies habe ich so gemacht:
Code:

ObjektA = A;
ObjektB = B;
 


Ich muss Matlab jetzt ja noch irgendwie sagen, dass ObjektB die Unterklasse von ObjektA ist, und ObjektB die Daten von ObjektA verwerden kann. Wurde leider nicht fündig, wie das geht.

Viele Grüße und vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.01.2013, 11:06     Titel:
  Antworten mit Zitat      
Hallo,

du solltest bei Objekten der Klasse B auf vererbte Eigenschaften mit
Code:
obj.EigenschaftA
zugreifen können.

Im Grunde genauso, als ob du die Eigenschaft für die Klasse B definieren würdest.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MarekJosef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 10.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2013, 12:02     Titel:
  Antworten mit Zitat      
Aber Matlab weiß doch gar nicht, dass meine erzeugte Klasse ObjektB die Unterklasse von ObjektA ist.
Wie würde das denn in meinem Code aussehen, bitte mit Initialisierung der Objekte.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.01.2013, 12:39     Titel:
  Antworten mit Zitat      
Hallo,

sprichst du jetzt von Klassen oder von den Instanzen der Klassen, den Objekten?
Was die Klassen angeht: mit classdef B < A wird festgelegt, dass B von A vererbt wird. Instanzen von B übernehmen somit auch die Properties und Methods von A, sofern sie nicht explizit umdefiniert oder erweitert werden.
Was die daraus erzeugten Objekte, also die Instanzen angeht: ObjektA und ObjektB sind vollkommen unabhängig voneinander. Es gibt meines Wissens keine Möglichkeit, vom einen auf das andere zuzugreifen. Ich sehe darin auch keinen Sinn.
Du brauchst gar kein Objekt der Klasse A, sondern kannst direkt in der Klasse B mit den aus A vererbten Eigenschaften arbeiten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MarekJosef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 10.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2013, 13:17     Titel:
  Antworten mit Zitat      
Ich finde, das würde ganz viel Sinn machen, wenn man Instanzen A und B zueinander ordnen könnte.

Mein Fall ist so: Ich werde viele Instanzen der Klasse B haben, diese in einem Vektor abspeichern. Aber, all diese verschiedenen Instanzen von B sollen alle genau die gleiche Instanz von A als Superklasse haben. Das heißt z.B. 100 Instanzen von B und nur eine Instanz von A. Das wäre ja jetzt doof, wenn ich auch 100 mal A als Instanz aufrufen muss, weil diese immer die gleichen Werte hätte.

Das muss doch irgendwie funktionieren. Das frisst mir doch den Speicher leer.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Ich finde, das würde ganz viel Sinn machen, wenn man Instanzen A und B zueinander ordnen könnte.

A und B sind ja einander zugeordnet, nur ObjektA und ObjektB nicht. Da also bitte wirklich aufpassen, wovon man redet.
Das Zuordnen der Objekte ist meines Wissens in dieser Form nicht möglich. Man könnte jedoch A als Handle-Klasse (damit die Kopien vermieden werden) definieren und B nicht von A vererben, sondern diese Information als Eigenschaft von B definieren, die von der Klasse A ist (geht in Richtung Aggregation).

Zitat:
Mein Fall ist so: Ich werde viele Instanzen der Klasse B haben, diese in einem Vektor abspeichern. Aber, all diese verschiedenen Instanzen von B sollen alle genau die gleiche Instanz von A als Superklasse haben. Das heißt z.B. 100 Instanzen von B und nur eine Instanz von A. Das wäre ja jetzt doof, wenn ich auch 100 mal A als Instanz aufrufen muss, weil diese immer die gleichen Werte hätte.

Was ich dann vorschlagen würde: die Klasse B so aufzubauen, dass du statt mit Vektoren von Instanzen mit einer Instanz arbeitest, die Vektoren von Daten beinhaltet.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MarekJosef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 10.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2013, 14:13     Titel:
  Antworten mit Zitat      
Könntest Du mir bitte das mal in meinem Code aufzeigen, was ich da jetzt ändern muss?
Was ich aber nicht will, ist, dass die EigenschaftA als eine Eigenschaft in der Klasse B definiert wird. Das soll der Übersichtlichkeit getrennt bleiben. Würde gerne das mit den Referenzen aufgreifen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.01.2013, 14:21     Titel:
  Antworten mit Zitat      
Hallo,

das ist nicht in ein paar Zeilen getan.

Zum ersten Vorschlag noch genauer: die Implementierung von A und B bliebe trotzdem getrennt. Im Konstruktor von B (du hast noch keinen) würde dann festgelegt, welches ObjektA dem ObjektB zugeordnet wird.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MarekJosef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 10.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2013, 14:39     Titel:
  Antworten mit Zitat      
Danke, aber ich versteh das jetzt noch immer nicht ganz. Das Klassenkonzept ist doch nicht so toll, wie ich anfangs fand.

Ich finde das unlogisch, dass man Instanzen nicht andere Instanzen als Unterinstanz zuweisen kann. Das erleichtert doch vieles.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

kannst du doch, aber eben als Eigenschaft.

Dein Beispiel ist zu minimal, um da mit ein paar Zeilen etwas machen zu können.

Ich schau mal, ob ich da demnächst ein Beispiel zusammenstellen kann.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2013, 10:33     Titel:
  Antworten mit Zitat      
Hallo,

habe nun doch ein recht einfaches Beispiel gefunden:

Code:
classdef A  
    properties
         EigenschaftA
    end
end


Code:
classdef B
    properties
         EigenschaftB
         AinB
    end
   
    methods
         function obj = B(Ain)
             obj.AinB = Ain;
         end
    end  
end


Aufruf:
Code:
objA = A;
objA.EigenschaftA = rand(1e7,1);
% Beobachte mit Task Manager den Speicherbedarf - er steigt nicht weiter an.
objB = B(objA);
objB(2) = B(objA);
mean(objB(1).AinB.EigenschaftA)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MarekJosef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 10.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2013, 12:05     Titel:
  Antworten mit Zitat      
Vielen Dank, ich werds dann mal ausprobieren
Private Nachricht senden Benutzer-Profile anzeigen
 
MarekJosef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 10.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 11:18     Titel:
  Antworten mit Zitat      
Ich habs jetzt mal ausprobiert. Und, ich zweifel da noch etwas daran, dass der Speicherbedarf nicht ansteigt.
Ich habe das Objekt B zum ersten Mal initialisiert. Im Workspace kann ich dessen Größe in Bytes ablesen. Das wären bei Deinem Beispiel ca. 80 Millionen Bytes.
Wenn ich jetzt B(2) initialisiere, hat B nun den doppelten Platz, also ca. 160 Millionen Bytes.

Ich habe dies auch im Taskmanager unter "Performance" und dann "Memory", der physical memory, nachgeschaut. In der Tat wächst da der Speicher nur einmalig bei der Initialisierung von A auf, bei weiteren Initialisierungen von B bleibt diese Memory gleich.

Könntest Du mir bitte das Erklären, warum im Workspace von Matlab trotzdem die Bytes angezeigt werden und diese aber nicht in die Memory eingehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.01.2013, 11:26     Titel:
  Antworten mit Zitat      
Hallo,

Ja, A ist rund 80 MB groß.
Jedes B enthält nun A, MATLAB ist aber schlau genug um zu merken, dass es dasselbe A ist. Solange also an dem A in B keine Veränderungen vorgenommen werden, wird keine Kopie im Speicher angelegt.

Mehr dazu:
http://blogs.mathworks.com/loren/20.....-functions-and-variables/
Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MarekJosef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 10.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 11:38     Titel:
  Antworten mit Zitat      
Ich hoffe, ich nerve Dich nicht Confused .
Vielen Dank erst mal für die Antwort.
Was wäre denn jetzt, wenn ich z.B. 10 Objekte von B initialisiere, alle mit den gleichen Daten von A. Dann muss ich aber die Daten vom initialisierten Objekt A verändern, und jedes der 10 initiierten Objekte von B soll jetzt mit diesen veränderten Daten weiterarbeiten.
Die Objekte B sollte ich aber nicht neu initialisieren, da diese weitere Daten beinhalten, die ich mit den Anfangsdaten vom Objekt A berechnet hab, und die ich weiterverwenden möchte.

Ich könnte ja auf ObjB.AinB.EigenschaftA zugreifen und die alten Daten überschreiben. Aber, ist da Matlab noch immer so schlau, dass es merkt, dass es all die gleichen Daten sind? Ich glaube doch eher nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.