Gemeinsame Basisklasse von 2 Objekten ermitteln

Azatoth

Mitglied
Hallo zusammen,

ich habe in meinem Programm folgende Klassenstruktur:

Klassenstruktur.JPG

Mein Problem ist jetzt das ich gerne die Klasse ermitteln würde die beide Objekte gemeinsam haben.

Aufgabe:
- Gegeben ist eine Liste mit verschiedenen Objekten dieser Klassenstruktur
- Gesucht ist die Klasse die alle Objekte der Liste gemeinsam haben

Besipiele:
Objekt1 = CText
Objekt2 = CHaltepunkt
Gemeinsame Klasse = CObjekt

Objekt1 = CText
Objekt2 = CGrafik
Gemeinsame Klasse = CBeschriftungsObjekt

usw.

Hat da jmd. eine Idee oder muss ich wirklich alle Fälle mühsam durchgehen und mit If...Else If.. auswerten.
 

sheel

I love Asm
Hi

beim ersten der Beispiele ist doch CText das Ergebnis?

Sowas kann man in .NET jedenfalls leicht mir Reflections lösen.
Mit .GetType() bei einem beliebigen Objekt bekommst du ein Type-Objekt,
über das du die ganze Reihe der Parentklassen abfragen kannst. (BaseType)

Dann kannst du vergleichen, wie viele der Parents übereinstimmen.
Der letzte übereinstimmende Name ist dann eben die gesuchte Klasse.
 

Azatoth

Mitglied
Hallo Sheel und danke für die Antwort,

das erste Beispiel war schon richtig. CHaltepunkt erbt ja von CObjekt und CText erbt von CBeschriftungsobjekt und CBeschriftungsobjekt erbt von CObjekt also ist CObjekt die nächste gemeinsame Klasse.

Mit der GetType() Methode habe ich es schon probiert das war jedoch ziemlich umständlich da ich alle Typen mit if..else if... vergleichen musste. Ich dachte mir deshalb das wäre im Bezug auf die Erweiterbarkeit keine sehr elegante Methode. Mit BaseType habe ich es noch nicht versucht vielleicht bringt mich das ja weiter, ich werde es mir mal ansehen.
 

sheel

I love Asm
Zum ersten Beispiel: Mein Fehler.
Keine Ahnung, was ich da zuerst gesehen hab...

Zu den Reflections:

Nimm von einer Variable den BaseTpe, vom Basetype den BT, von diesem wieder
den BT...Schleife bis BT==null, das ist dann Object.
Alle BTs in ein Array/Liste/etc, so dass am Anfang Object, dann CBasisklasse usw.

Das für die andere Variable nocheinmal.

Dann in einer Schleife vergleichen, wieviel der Array/Listenelemente am Anfang gleich sind.
Das letzte Gleiche ist das Gesuchte.
 

rd4eva

Erfahrenes Mitglied
Nimm von einer Variable den BaseTpe, vom Basetype den BT, von diesem wieder
den BT...Schleife bis BT==null, das ist dann Object.
Alle BTs in ein Array/Liste/etc, so dass am Anfang Object, dann CBasisklasse usw.

Das für die andere Variable nocheinmal.

Dann in einer Schleife vergleichen, wieviel der Array/Listenelemente am Anfang gleich sind.
Das letzte Gleiche ist das Gesuchte.

Völlig Richtig. Es geht allerdings auch ohne Arrays/Listen etc.

C#:
Type sharedType = object1.GetType();
while (!sharedType.IsAssignableFrom(object2.GetType()))
    sharedType = sharedType.BaseType;