Announcement

Collapse
No announcement yet.

Vererbung von Delegaten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Vererbung von Delegaten

    Hallo,

    ich habe folgendes Problem.

    Ich habe eine Erweiterung eines vorhandenen Framework-Controls geschrieben, nennen wir es "ControlEx" und in diversen Programmen verwendet.
    Jetzt habe ich diese Erweiterung auf generisch umgestellt, also "Generic.ControlEx(Of T)".
    Um aber nicht alle meine Programme auf einmal auf die generische Variante umstellen zu müssen, habe ich ein neues "ControlEx" erstellt, was von "Generic.ControlEx(Of Object)" erbt.

    Da in der generischen Variante einige Unterklassen (z.B. Items und EventArgs) existieren, die ebenfalls generisch sind, und ich das Einfügen von "(Of Object)" in allen meinen Programmen, die diese Unterklassen verwenden, umgehen will, habe ich von diesen generischen Unterklassen ebenfalls allgemeine Versionen erstellt und überschreibe in meiner allgemeinen "ControlEx" die Funktionen und Prozeduren, die generische Typen nach außen geben, durch nicht generische Kopien.

    Soweit so gut.

    Jetzt habe ich allerdings in meiner generischen Variante "Generic.ControlEx(Of T)" auch einen Delegate erstellt

    Code:
    Public Delegate Function GetItemPropertiesFunction(Of T)(ByVal item As T) As ItemProperties
    der in der allgemeinen Variante "ControlEx" zu

    Code:
    Public Delegate Function GetItemPropertiesFunction(ByVal item As Object) As ItemProperties
    wird.

    Dummerweise funktioniert dann aber der folgende Code in der allgemeinen Variante "ControlEx" nicht, weil man die beiden Delegaten nicht ineinander umwandeln kann.


    Code:
      Public Shadows Property GetItemProperties() As GetItemPropertiesFunction
        Get
          Return MyBase.GetItemProperties         '<--   (Of Object)
        End Get
        Set(ByVal value As GetItemPropertiesFunction)
          MyBase.GetItemProperties = value
        End Set
      End Property
    Es hilft auch nicht, wenn man die Definition des allgemeinen Delegaten auf

    Code:
    Public Delegate Function GetItemPropertiesFunction() As _
    Generic.GetItemPropertiesFunction(Of Object)
    umstellt.

    Hat jemand vielleicht eine Lösung für dieses Problem?

  • #2
    Hallo,

    ab .net 4.0 geht das mit Co-/Contravarianz. Siehe Variance in Delegates

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo,

      das liest sich so, als ob ein Austausch der Delegatdefinition in der generischen Variante "Generic.ControlEx(Of T)" durch

      Code:
      Public Delegate Function GetItemPropertiesFunction(Of In T) _
      (ByVal item As T) As ItemProperties
      helfen sollte ("(Of In T)" statt "(Of T)"). Es funktioniert aber trotzdem nicht.

      Mache ich etwas falsch oder habe ich etwas falsch verstanden?

      Comment


      • #4
        Hallo nochmal,

        vielleicht zur Vereinfachung des Ganzen ein Code-Stück:

        Code:
        Public Delegate Function GenericDelegate(Of T)(ByVal item As T) As String
        Public Delegate Function NonGenericDelegate(ByVal item As Object) As String
        
        Public Sub Test()
            Dim generic As GenericDelegate(Of String)
            Dim nonGeneric As NonGenericDelegate
        
            generic = New GenericDelegate(Of String)(Function(x As String) x)
            nonGeneric = generic
          End Sub
        In der letzten Zeile meldet er mir, dass ein GenericDelegate(Of String) nicht in ein NonGenericDelegate umgewandelt werden kann.
        Und es hilft auch nicht, wenn ich in der ersten Zeile das "(Of T)" in ein "(Of In T)" umwandele.

        Comment


        • #5
          Hallo,

          dass ein GenericDelegate(Of String) nicht in ein NonGenericDelegate umgewandelt werden kann.
          Das hab ich übersehen. Das geht aber auch nicht. Was bleibt ist dass im nichtgenerischen Delegaten auf einen generischen weiterdelegiert werden kann - also dort einfach ein generischer aufgerufen wird.

          Vllt. nützt dir als Vorlage wenn du mit dem Reflektor zB die List(of T)-Klasse anschaust. Dort v.a. die Implementierung von IEnumerable und IEnumerable(of T).


          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment


          • #6
            Das habe ich befürchtet. Es sieht auf den ersten Blick immer so einfach aus, bis man dann anfängt, sich richtig damit auseinander zu setzen.

            Naja, da es nur temporär sein soll, werde ich wohl in den sauren Apfel beißen und das "(Of Object)" in allen betreffenden Programmen einfügen, sind ja glücklicherweise nicht so viele Stellen betroffen.

            Aber danke trotzdem.

            Comment


            • #7
              Hallo,

              da es nur temporär sein soll
              Verwende da zur Sicherheit das Obsolete-Attribut. Damit das später nicht vergessen wird.


              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Hmmm... ich glaub das hatte auch einen Sinn dass Microsoft z.B. die generischen Listen von den nicht generischen Listen trennt. Ich denke ich würde diesen beiden Implementierungen nicht vermischen. Die neue Variante ist eben neu, die alte wird als deprecated gekennzeichnet und sollte eben nicht mehr verwendet werden.

                Comment

                Working...
                X