Wenn ich Ihre Frage richtig verstehe, kann die Antwort davon abhängen, wie Sie die Klassen erstellen, aus denen Sie die Objekte instanziieren. In den neuesten Versionen von MATLAB können Klassen auf zwei Arten definiert werden: als "value"-Klasse oder als "handle"-Klasse (MATLAB-Dokumentation aquí ). Ich zitiere aus der Dokumentation:
-
Wertklasse: "Objekte von Wertklassen sind dauerhaft mit den Variablen verbunden, denen sie zugeordnet sind. Wenn ein Wertobjekt kopiert wird, werden auch die Daten des Objekts kopiert und das neue Objekt ist unabhängig von Änderungen am ursprünglichen Objekt. Instanzen verhalten sich wie Standard MATLAB numeric und struct Klassen."
-
Klasse handhaben: "Objekte von Handle-Klassen verwenden ein Handle, um auf Objekte der Klasse zu verweisen. Ein Handle ist eine Variable, die eine bestimmte Instanz einer Klasse identifiziert. Wenn ein Handle-Objekt kopiert wird, wird das Handle kopiert, aber nicht die Daten, die in den Eigenschaften des Objekts gespeichert sind. Die Kopie bezieht sich auf dieselben Daten wie das Original - wenn Sie einen Eigenschaftswert des Originalobjekts ändern, spiegelt das kopierte Objekt die gleiche Änderung wider."
Der folgende Beispielcode enthält einige Beispiele für die Interaktion mit "verschachtelten" Objekten, wie Sie sie oben beschrieben haben, sowohl für verschachtelte Objekte der Klasse value als auch für verschachtelte Objekte der Klasse handle:
% For value classes:
objC = C(...); % Make an object of class C, where "..." stands
% for any input arguments
objB = B(...,objC); % Make an object of class B, passing it objC
% and placing objC in field 'objC'
objA = A(...,objB); % Make an object of class A, passing it objB
% and placing objB in field 'objB'
% If the '.' operator (field access) is defined for the objects:
objA.objB.objC.D = 1; % Set field 'D' in objC to 1
objA.objB.objC = foo(objA.objB.objC,...); % Apply a method that
% modifies objC and
% returns the new
% object
% For handle classes:
hC = C(...); % Get a handle (reference) for a new object of class C
hB = B(...,hC); % Get a handle for a new object of class B,
% passing it handle hC and placing it in field 'hC'
hA = A(...,hB); % Get a handle for a new object of class A,
% passing it handle hB and placing it in field 'hB'
% If the '.' operator (field access) is defined for the objects:
hC.D = 1; % Set field 'D' to 1 for object referenced by hC; Note
% that hC and hA.hB.hC both point to same object, and
% can thus be used interchangably
foo(hC); % Apply a method that modifies the object referenced by hC
% If instead using get/set methods for the handle object:
set(hC,'D',1);
set(get(get(hA,'hB'),'hC'),'D',1); % If variable hC wasn't made, get
% reference from nested objects
foo(hC);
foo(get(get(hA,'hB'),'hC'));
Wie Sie sehen, können Sie durch die Verwendung einer Handle-Klasse vermeiden, dass Sie Funktionsaufrufe und Feldreferenzen verketten müssen, indem Sie eine Kopie des Handles (im Wesentlichen einen Zeiger) in einer anderen Variablen speichern. Handle-Klassen machen es auch überflüssig, alte Kopien von Objekten mit neuen Kopien zu überschreiben, die von Methoden zurückgegeben werden, die mit diesen Objekten arbeiten.
Ich hoffe, das hilft Ihnen bei Ihrer Frage.