GetType(T) mal umgekehrt

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    GetType(T) mal umgekehrt

    Hallo,

    Ich habe ein Problem mit Typenparametern und wollte wissen, ob es da eine Lösung gibt. Man kann ja per Typenparameter (Of T) den Datentyp direkt übergeben. Jetzt habe ich das Problem, dass ich eine Funktion habe, in einer Klasse, von der mehrere weitere klasse erben. Jetzt will ich in dieser Klasse den Typ der erbenden Klasse erhalten. Dazu habe ich bisher Me.Gettype genutzt. Die Frage ist, wie ich über diesem Typ den Datentyp erhalten, den ich wiederum einer Funktion übergeben kann, die einen Typenparameter besitzt.
    Klingt kompliziert. Am dem Beispiel würde ich gerne jetzt der Funktion 2 irgendwie den Typ der Kindklasse übermitteln

    VB.NET-Quellcode

    1. Mustinherit Class Mutterklasse
    2. Sub KindTypWeitergegen
    3. Funktion1(Me.GetType)
    4. Funktion2(Of ???)()
    5. End Sub
    6. Sub Funktion1(ByRef pType As Type)
    7. ...
    8. End Sub
    9. Sub Funktion2(Of T)
    10. ...
    11. End Sub
    12. End Class


    Grüße
    Malior
    Hi.

    Da das Verhalten offenbar für die Kindklassen transparent ablaufen soll, musst du in Funktion2 einen Parameter definieren, der vom Typ des Typparameters ist (As T). Funktion1 wird dadurch überflüssig. Um die Transparenz zu wahren, sollte Funktion2 Private deklariert werden, sofern sie in den Kindklassen nicht benötigt wird. Ansonsten sollte eine entsprechende Überladung als Private definiert werden, sodass nur die Mutterklasse Zugriff auf diese Methode hat. Anbei noch ein kommentiertes Codebeispiel:

    VB.NET-Quellcode

    1. MustInherit Class Mutterklasse
    2. Sub KindTypWeitergeben()
    3. 'Funktion1(Me.GetType)
    4. Funktion2(Me)
    5. End Sub
    6. 'Sub Funktion1(ByRef pType As Type)
    7. 'End Sub
    8. Private Sub Funktion2(Of T)(ByVal param As T)
    9. 'param enthält durch Polymorphie eine Referenz auf das aktuelle Objekt,
    10. 'dessen Typ mit param.GetType oder TypeOf...Is ausgewertet werden kann.
    11. 'Der Typparameter wird automatisch ermittelt, wodurch Funktion1 überflüssig ist.
    12. If TypeOf param Is Kindklasse Then
    13. 'dieser Ausdruck wird zu True ausgewertet, wenn ein Objekt vom Typ "Kindklasse" die Methode DoSomething aufruft.
    14. End If
    15. End Sub
    16. End Class
    17. Class Kindklasse
    18. Inherits Mutterklasse
    19. Sub DoSomething()
    20. MyClass.KindTypWeitergeben()
    21. End Sub
    22. End Class
    Gruß
    hal2000
    Hallo,

    Ja, leider geht das in meinem Fall nicht. Die Situation ist die, dass meine Elternklasse im Konsturktor eine Subroutine eines dort erzeugten Objekts aufruft, und dort wird dann das T benötigt.
    Und die Funktion die da genereisch aufgerufen werden sollte muss so sein wie sie jetzt ist.

    VB.NET-Quellcode

    1. MustInheri Class Elternklasse
    2. Private _objekt2 As Object
    3. Private _meinObject as ISpezialObjekt
    4. Sub New()
    5. MyBase.New()
    6. _meinObjekt = New SpezialObjekt()
    7. _objekt2 = _meinObject.ErmittleObjekt(Me.GetType) 'Geht in dem fall leider nicht
    8. _objekt2 = _meinObject.ErmittleObjekt(Of ??)() 'Was muss hier rein
    9. End Sub
    10. End Class
    Ja, leider geht das in meinem Fall nicht.

    Warum nicht?

    Da Basisklassen normalerweise nichts von ihren erbenden Klassen wissen, wird dein Vorhaben so nicht realisierbar sein. Du solltest dein Design also grundlegend überarbeiten, falls möglich. Der Parameter ist eine kleine "Hintertür", die mir gerade so eingefallen war. Allerdings verschiebst du das Problem dann nur ein wenig in Richtung des Aufrufs, der den Typparameter letztendlich benötigt. Diesen kannst du jedoch auch nicht dynamisch bestimmen, was dirch zur Ausgangsfrage zurückführt.

    Du könntest noch folgendes versuchen:
    - Der Elternklasse und deren Kindklassen Typparameter hinzufügen, sodass die Typhoheit beim Aufrufer liegt
    - Eine virtuelle Methode schreiben und den Aufruf an das SpezialObjekt in die Kindklassen verlagern.
    Gruß
    hal2000