簡體   English   中英

如何使用泛型覆蓋派生類中的屬性

[英]How to override properties in a derived class using generics

我有以下課程設置,但我不明白為什么它無法編譯。

我在“公共替代屬性F為T”時收到以下錯誤

  • “公共替代屬性F為T”不能替代“公共替代屬性F為X”,因為它們的返回類型不同。
  • 這使我感到困惑,因為我將T約束為從X派生。

有人可以解釋我如何實現這個目標嗎? 最后,我需要具有A類和B類,其中B繼承自A。其中A具有類型X的可重寫屬性F,而B使用從X派生的類型覆蓋F。提出任何建議。 如果無法做到這一點,我很想知道為什么(.NET的局限性?)以及該如何處理。

Public Class X
End Class

Public Class Y
    Inherits X
End Class

Public Class A
    Public Overridable Property F As X
End Class

Public Class A(Of T As X)
    Inherits A
    Public Overrides Property F As T
End Class

Public Class B
    Inherits A(Of Y)
    Public Overrides Property F As Y
End Class

謝謝!

新答案。 我認為這不可能(完全按照您的要求),即B overrides F with a type that is derived from X如您所見,用B overrides F with a type that is derived from X

但是您可以將Y保留在B的私有字段中,並通過F對其進行公開。然后,您需要將F強制轉換為Y,以訪問Y在X上提供的任何功能。這可以在不更改A的​​情況下完成。

Public Class X
    Public Overridable Function Z() As String
        Return "X"
    End Function
End Class

Public Class Y
    Inherits X
    Public Overrides Function Z() As String
        Return "Y"
    End Function
    Public Function Foo() As String
        Return "Bar"
    End Function
End Class

Public Class A
    Public Overridable Property F As X
End Class

Public Class B
    Inherits A
    Private _f As Y
    Public Overrides Property F As X
        Get
            Return _f
        End Get
        Set(value As X)
            _f = DirectCast(value, X)
        End Set
    End Property
End Class

用法:

Dim a As New A()
Dim x As New X()
Dim b As New B()
Dim y As New Y()

a.F = x
Console.WriteLine(a.F.Z)
' Console.WriteLine(DirectCast(a.F, Y).Foo()) ' InvalidCastException

b.F = y
Console.WriteLine(b.F.Z)
Console.WriteLine(DirectCast(b.F, Y).Foo()) ' OK

產量

X
ÿ
酒吧

我終於找到了一種解決方案,該解決方案可以在使用Shadows關鍵字后實現所需的功能。

Imports System

Public Module Module1
    Public Sub Main()
        Dim a As New A()
        Dim b As New B()

        a.F = New X()
        b.F = New Y()

        Dim c As New Container()
        c.Value = a

        Console.WriteLine(c)        

        c.Value = b

        Console.WriteLine(c)        
    End Sub
End Module

Public Class Container
    Public Value As A
    Public Overrides Function ToString() AS String
        Return Value.ToString()
    End Function
End Class

Public Class X
    Public Overrides Function ToString() AS String
        Return "X"
    End Function
End Class

Public Class Y
    Inherits X
    Public Overrides Function ToString() AS String
        Return "Y"
    End Function
End Class


Public Class A
    Public Overridable Property F As X
    Public Overrides Function ToString() AS String
        Return "A" + F.ToString()
    End Function
End Class

Public Class B
    Inherits A
    Public Shadows Property F As Y
    Public Overrides Function ToString() AS String
        Return "B" + F.ToString()
    End Function
End Class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM