Matlab Polymorphismus

7

Ich habe zwei neue MATLAB-Klassen - B & amp; C , beide konkreten Unterklassen eines abstrakten Elternteils, A . A ist eine Unterklasse von hgsetset (Handle-Klasse). Ich möchte sie in ein Array in MATLAB einfügen und beide als A s behandeln. Sie sind grob definiert als:

%Vor%

Aber wenn ich das tue:

%Vor%

MATLAB sagt mir, dass beide vom Typ B sind, und wenn ich die abstrakte Methode von A aufrufen, die beide implementieren ( foo ), führt sie im Wesentlichen zwei Kopien von b aus.

Wenn ich jedoch die Reihenfolge umkehre:

%Vor%

Es sagt mir, dass beide vom Typ C sind, und wenn ich versuche, foo auf beiden auszuführen, führt es im Wesentlichen zwei Kopien von c aus.

Irgendwelche Ideen wie man Subklassen polymorph macht?

Ich weiß, dass ich sie in ein Zellen-Array setzen kann und 90% von dem bekomme, was ich brauche. Aber das ist ein bisschen ein Kludschlamm.

    
Marc 22.09.2009, 04:23
quelle

2 Antworten

16

Sie können dies jetzt in R2011a tun, indem Sie matlab.mixin.Heterogenous ableiten. Also zum Beispiel wie in Ihrem Code wäre die abstrakte Klasse:

%Vor%

und die Unterklassen würden wie folgt aussehen:

%Vor%

und ähnlich für eine Klasse "C". Dies gibt dann die folgende Ausgabe von MATLAB:

%Vor%     
Thomas Ibbotson 22.04.2011 14:27
quelle
4

Leider müssen alle Elemente eines Arrays in MATLAB vom selben Typ sein. Wenn Sie verschiedene Klassen verketten, versucht MATLAB, sie alle in die gleiche Klasse zu konvertieren.

Wenn Sie eine Ihrer Klassen als minderwertig oder besser als die andere definiert haben (mit dem InferiorClasses Attribut oder INFERIORTO / SUPERIORTO Funktionen), dann die Methoden der mehr höhere Klasse werden aufgerufen. Wenn Sie keine Beziehung zwischen den Klassen angegeben haben, haben die beiden Objekte die gleiche Priorität, und MATLAB ruft die Methode für das am weitesten links liegende Objekt auf. Dies ist wahrscheinlich der Grund, warum arr = [b c]; ein Array der Klasse B erstellt und arr = [c b]; ein Array der Klasse C erstellt.

Option 1: Zellenarrays

Wenn Sie die für Klasse B definierte Methode foo für Objekt b ausführen und auch die für Klasse C definierte Methode foo für Objekt c ausführen möchten, müssen Sie wahrscheinlich Zellenarrays verwenden und die Funktion CELLFUN . Wenn foo keinen Wert zurückgibt, könnten Sie Folgendes tun:

%Vor%

Option 2: Spaß mit polymorphem Verhalten der Geschworenen

Aus Spaß habe ich eine mögliche Lösung gefunden, die technisch funktioniert, hat aber einige Einschränkungen. Um die Idee zu illustrieren, habe ich ein paar Beispielklassen zusammengestellt, die denen in der Frage ähnlich sind. Hier ist die abstrakte Oberklasse classA :

%Vor%

Und hier ist ein Beispiel für die Unterklasse classB ( classC ist genau das gleiche mit überall B ersetzt durch C und umgekehrt):

%Vor%

Die Konstruktoren für classB und classC sind so konzipiert, dass die beiden Klassen ineinander konvertiert werden können. Die Eigenschaft originalClass wird bei der Erstellung initialisiert und gibt an, wie die ursprüngliche Klasse des Objekts war. Diese Eigenschaft bleibt unverändert, wenn ein Objekt von einer Klasse in eine andere konvertiert wird.

Innerhalb der Methode foo wird die aktuelle Klasse des übergebenen Objekts mit der ursprünglichen Klasse verglichen. Wenn sie sich unterscheiden, wird das Objekt zuerst in seine ursprüngliche Klasse konvertiert, bevor die Methode fooWorker aufgerufen wird. Hier ist ein Test:

%Vor%

Eine wichtige Einschränkung (abgesehen von etwas hässlich) ist der Fall, in dem classB und classC jeweils Eigenschaften haben, die die anderen nicht haben. In einem solchen Fall würde das Konvertieren in die andere Klasse und das anschließende Zurückkonvertieren wahrscheinlich dazu führen, dass diese Eigenschaften verloren gehen (d. H. Auf ihre Standardwerte zurückgesetzt werden). Wenn jedoch eine Klasse eine Unterklasse der anderen Klasse wäre, so dass sie alle die gleichen Eigenschaften und Eigenschaften hätte, gibt es eine Lösung. Sie könnten die Unterklasse so einstellen, dass sie der Oberklasse überlegen ist (siehe obige Diskussion), so dass die Verkettung von Objekten der beiden Klassen immer dazu führt, dass die Oberklassenobjekte in die Unterklasse konvertiert werden. Bei der Rückwandlung in "polymorphe" Methoden (wie foo oben) gehen keine Objektdaten verloren.

Ich weiß nicht, wie praktikabel eine Lösung ist, aber vielleicht gibt es Ihnen zumindest einige interessante Ideen. ;)

    
gnovice 22.09.2009 05:38
quelle