Autor |
Beitrag |
UGrohne
Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 23.10.06 13:39
Hallo,
ich muss ein Objekt zur Laufzeit in einen zur Entwicklungszeit noch unbekannten Typ casten. Ich habe den Typ und eine Variable mit der Elternklasse des Objekts:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| string result = ""; foreach (UpdateItem item in updateItems) { System.Type type; Classes.TryGetValue(item.node.Name, out type); result += item.Update(); } return result; |
An der markierten Stelle muss ich nun item in die in type hinterlegte Klasse casten. Gibt es dafür eine Möglichkeit?
|
|
Kha
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 23.10.06 15:39
Dazu solltest du erst einmal beschreiben, wofür du das Objekt casten willst . Geht es darum, die Methode Update der abgeleiteten Klasse aufzurufen? Wenn ja, wirst du wohl einen Grund haben, das nicht per OOP zu regeln, musst deswegen aber auf Reflection => MethodInfo.Invoke zurückgreifen.
|
|
UGrohne
Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 23.10.06 16:49
Khabarakh hat folgendes geschrieben: | Dazu solltest du erst einmal beschreiben, wofür du das Objekt casten willst . Geht es darum, die Methode Update der abgeleiteten Klasse aufzurufen? Wenn ja, wirst du wohl einen Grund haben, das nicht per OOP zu regeln, musst deswegen aber auf Reflection => MethodInfo.Invoke zurückgreifen. |
Ich habe eine Basis-Klasse, die bestimmte Eigenschaften zur Verfügung stellt und je nach Anwendungszweck wird eine Subklasse davon entwickelt, die die Verarbeitungsanforderungen erfüllt. Doch soll das Ganze auch ovn außen erweiterbar sein, deswegen kann ich diesen Typecast nicht hart codieren, z.B. über cases.
Das Erzeugen funktioniert bereits einwandfrei. Die Anweisung für einen Typ liegen in einer XML-Datei, daher kenne ich die Klasse, die erzeugt werden muss. Jetzt muss ich eben auf die Methoden dieser Klasse zurückgreifen können. Mit obigem Code bekomme ich natürlich nur die Update-Anweisung der Basis-Klasse ausgeführt, deswegen muss ich wohl auf Deinen Tipp zurückgreifen. Ich werde das nachher mal probieren, aber vielleicht hast Du noch eine bessere Idee, wie ich mein Ziel erreichen könnte?
|
|
r2c2
Beiträge: 324
Erhaltene Danke: 2
Linux
|
Verfasst: Mo 23.10.06 17:38
UGrohne hat folgendes geschrieben: | Mit obigem Code bekomme ich natürlich nur die Update-Anweisung der Basis-Klasse ausgeführt, [...] |
Wenn die Methode überschrieben wird nicht. Oder hab ich dein Problem falsch verstanden?
mfg
Christian
_________________ Kaum macht man's richtig, schon klappts!
|
|
UGrohne
Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 23.10.06 18:04
r2c2 hat folgendes geschrieben: | Wenn die Methode überschrieben wird nicht. Oder hab ich dein Problem falsch verstanden? |
UpdateItem ist die Basisklasse, von der alle Erweiterungsklassen abgeleitet werden. Daher wird offensichtlich die Update-Methode der Klasse UpdateItem aufgerufen und nicht der abgeleiteten Klasse UpdateFile (in diesem Fall). Die Methode habe ich natürlich in der abgeleiteten Klasse überschrieben.
//EDIT: Ich habe schon an meinen OOP-Kenntnissen gezweifelt. Ich hatte vergessen bei der abgeleiteten Klasse override hinzuzufügen
Danke trotzdem
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 23.10.06 18:06
Wenn Du die Methode in der Basisklasse als virtuell (oder gar abstrakt) deklarierst, dann wird die Methode der instanzierten Klasse aufgerufen und nicht die Methode der deklarierten Klasse.
//Edit: Hm, zu spät.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
UGrohne
Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 23.10.06 18:28
Christian S. hat folgendes geschrieben: | Wenn Du die Methode in der Basisklasse als virtuell (oder gar abstrakt) deklarierst, dann wird die Methode der instanzierten Klasse aufgerufen und nicht die Methode der deklarierten Klasse.
//Edit: Hm, zu spät. |
Man darf aber nicht das Schlüsselwort override vergessen
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 23.10.06 18:39
Gibt das nicht 'ne Warnung vom Compiler?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
UGrohne
Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 23.10.06 18:47
Christian S. hat folgendes geschrieben: | Gibt das nicht 'ne Warnung vom Compiler? |
Doch, aber die überseh ich im Moment noch gerne, weil es noch so viele sind Bin erst noch am Anfang der Entwicklung.
|
|
Robert_G
Beiträge: 416
Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
|
Verfasst: Mo 23.10.06 18:58
Ich habe echt keinen Plan wofür du den Typ da brauchst, aber eines fällt mir immer wieder auf.
Oft zwingen sich Programmierer in eine Vererbungspflicht, die nicht sein muss.
Gehe auf deine Basisklasse und mache ein Rechtsklick->Refactoring->Extract Interface.
Markiere die Member, die dich interessieren und benutze fortan nur noch dieses Interface.
Du kannst deine alte Basisklasse behalten und somit auch weiterhin Funktionalität erben, aber du musst es nicht mehr.
Außerdem haben interface instanzen den Vorteil, dass du die Kosten für virtual method dispatch pro call auf einen interface dispatch pro Instanz reduzierst.
Mag lächerlich kleinkariert klingen macht sich aber genau bemerkbar wie das versiegeln von Klassen.
|
|
UGrohne
Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Di 24.10.06 09:25
OK, danke für den Hinweis. Das werde ich mir genauer anschauen, ob ich das so umsetzen kann.
|
|