[英]How to override properties in a derived class using generics
我有以下課程設置,但我不明白為什么它無法編譯。
我在“公共替代屬性F為T”時收到以下錯誤
有人可以解釋我如何實現這個目標嗎? 最后,我需要具有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.