Verfasst am: 28.09.2009, 10:52
Titel: Luke, ich bin Dein Vater!
Hallo zusammen,
manchmal sieht es so aus, als sei ich der einzige im GoMatlab-Forum, der mit der OOP so seine Problemchen hat- oder daß OOP unter Matlab in anderen Foren besser aufgehoben ist. Oder ist das alles noch nicht so verbreitet?
Wie dem auch sei: Im Moment stellt sich mir die Frage, wie ich einem Objekt beibringe, wer seine Eltern sind. Oder konkreter:
Ich habe zwei Klassen foo und bar.
Jetzt die interessierende Frage: Wie kann ich dafür sorgen, daß ein Objekt der Klasse bar immer weiß, von welchem Objekt es erzeugt wurde?
Also sollte das in etwas so zu bedienen gehen:
Code:
a = foo;
b = a.sets(1);
c = b.parent;
a == c
ans =
true
Das Problem sieht von meiner Seite so aus: Unpraktischerweise muss der Konstruktor ja auch ohne Parameter aufgerufen werden können, sonst funktioniert z.B. repmat nicht. (lautete der Konstruktor so:
Code:
% Konstruktor function obj = bar(parentobj);
obj.data = [];
obj.parent = parentobj;
end
würde der Konstruktor bei der Konstruktion obj.sets = repmat(bar(obj),1,10); ja nur bei der ersten Instanz von bar durchlaufen. Die jüngeren Geschwister von sets(1) kennten dann ihre Eltern nicht.)
manchmal sieht es so aus, als sei ich der einzige im GoMatlab-Forum, der mit der OOP so seine Problemchen hat- oder daß OOP unter Matlab in anderen Foren besser aufgehoben ist. Oder ist das alles noch nicht so verbreitet?
Letzteres. Erstens ist es noch recht neu und zweitens finden viele Anwender es gerade so erfrisched einfach drauf los programmieren zu können...
Ich versuche mittelfristig jemanden zu finden der sich von MathWorks Seite aus für diese Forum und das OOP / MCOS Thema interessiert. Aber auch wir machen das alles nur nebenher. Zur Info: 5 der Top 2o Poster hier sind MathWorks Mitarbeiter.
Kurzfristig: Wenn die Probleme hier nicht gelöst werden können hilft entweder der Schwenk in die englische Sprache oder der Technische Support.
Ich denke, das Problem liegt daran, was genau hier bei REPMAT passiert. Im Zusammenhang mit Handle-Objekten ist das ja doch nicht so einfach. Auf Umwegen bin ich darauf gekommen, dass es mit
Hui, zuerst dachte ich, der Quelltextvorschlag sei magisch. Aber frickeln wir das mal auseinander. Die einfachste Klasse, die ich mir vorstellen könnte, wäre so:
Da der Konstruktor nur einmal aufgerufen wurde, ist das Array einfach mit Kopien des handles des gleichen Objektes gefüllt - klar, repmat wirkt ja auch auf ein cell array und nicht auf das Objekt.
Für eine value-Klasse wäre das wahrscheinlich die Lösung gewesen; für eine handle-Klasse leider nicht.
Ich versuche mittelfristig jemanden zu finden der sich von MathWorks Seite aus für diese Forum und das OOP / MCOS Thema interessiert. Aber auch wir machen das alles nur nebenher. Zur Info: 5 der Top 2o Poster hier sind MathWorks Mitarbeiter.
Kurzfristig: Wenn die Probleme hier nicht gelöst werden können hilft entweder der Schwenk in die englische Sprache oder der Technische Support.
Andreas
Die Mitmacher beim Matlab newreader konnte ich schon als sehr hilfreich und qualifiziert kennenlernen. Aber man will sich ja mit seinen OOP-Anfängerfragen nicht gerade vor einem weltweiten Publikum blamieren .
Daß hier Mitarbeiter schreiben, ist ja in manchen Fällen recht offensichtlich: Ort "Ismaning" deutet es ja schon an. Finde ich toll, daß man euch dazu begeistern kann!
Das das ganze OOP unter Matlab wohl noch ein Nischendasein fristet, habe ich mir schon gedacht. Eigentlich hat man ja erst sein R2009a die Chance, mit ordentlichen Fehlermeldungenr Fehler zu finden. Und auch die Möglichkeiten haben sich von 2007b bis 2009a steil verbessert.
Mal sehen, was die Zukunft bringt. Ich hoffe ja immer noch auf eine bessere Fehlerdarstellung von Fehlern innerhalb von events/callbacks.
so dumm ich den Spruch in der Schule damals fand: es gibt keine dummen Fragen, nur dumme Antworten.
Das Thema ist in MATLAB noch verhältnismäßig neu, trotzdem wird es auch im großen Stil schon von Kunden eingesetzt. Ich betreue einen Kunden, der gerade ein System entwickelt, das bereits aus über 100 Klassen mit mehr als 50000 Zeilen Code besteht ...
Ciao,
Titus
PS: übrigens gibt es auch in Aachen eine Niederlassung von The MathWorks
Hallo,
Ich betreue einen Kunden, der gerade ein System entwickelt, das bereits aus über 100 Klassen mit mehr als 50000 Zeilen Code besteht ...
Ist doch nicht viel?
Wir arbeiten derzeit aber noch nicht mit OOP, sondern haben damals uns eben etwas überlegt, wie wir OOP in Matlab herein bekommen... und arbeiten so zu sagen mit unserem "framework" in Matlab und haben mittlerweile so viele Module, Funktionen und Klassen... das wir derzeit nicht umsteigen können
%% Flaeche % Nur Testbeispiel: Eine Flaeche hat vier Eckpunkte und vier Kanten. % Jede Kante kann nur zu einer Flaeche gehoeren! properties
data;
borders;
end
methods % Konstruktor function obj = border() % Hier passiert nix. Und das ist gut. end
functionset.parent(obj,inp) % Der Parent-Parameter darf nur einmal gesetzt werden, direkt % nach der Erzeugung, aber nicht mehr geaendert! ifisempty(obj.parent);
ifstrcmpi(class(inp),'face')
obj.parent = inp;
else error('parent of border must be of class face') end else % Da der 'parent'-Parameter, einmal gesetzt, einen handle % auf das Mutterobjekt beinhalted, kann der % 'parent'-Parameter mit: % obj.parent = 'a' % nicht wieder geaendert werden- denn hier wird jetzt 'a' % in das Mutterobjekt geschrieben, und nicht etwa die % 'parent'-property auf 'a' gesetzt. % Diese Verhalten ist, obwohl durch 'Zufall' entstanden, % gewünscht - Niemand kann seine Eltern wechseln. % Der folgende Zweig sollte also nie erreicht werden % koennen. error(' border - the author never anticipated this branch to be reached.') end end
Zwar muss jetzt jedes Objekt direkt nach der Erzeugung sein Mutterobjekt beigebracht bekommen- aber das Ganze ist dann fest verbunden. Ist nicht weit vom Anfang entfernt (eigentlich wurde die Geschichte mit repmat und dem Konstruktor nur umgangen), dafür sieht das Ganze nach dem Speichern und wieder laden auch wie vorher aus.
Bonusfrage: Gäbe es jetzt noch eine Möglichkeit, das Mutterobjekt zu ändern, wenn ich das wollte? (Siehe Kommentar im set.parent-Block)
Denn:
Code:
>> a = face([1234; 1001]);
>> a.borders ans =
1x4 border handle
Properties:
data
parent
Denn in der markierten Zeile würde die set-function von borders ja nie wieder aufgerufen- denn es geht ja direkt in a. (Die Zeile mündet natürlich in einer sinnvollen Fehlermeldung.)
Viele Grüße
Nicolas
_________________
--
The programmer suggested it.
Einstellungen und Berechtigungen
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
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.