【问题标题】:Expanding Generic Constraints扩展通用约束
【发布时间】:2013-12-26 21:21:25
【问题描述】:

请看下面的代码。 Namespaces 代表 DLL 分段,而不是同一个 DLL 中的 Namespaces

Public Interface ICoreTableCollection
End Interface

Public Interface ICoreTableInstance
End Interface

Namespace Address.Tier1
    Public MustInherit Class AddressCollection(Of T As AddressInstance)
         Implements ICoreTableCollection
    End Class

    Public MustInherit Class AddressInstance
    End Class
End Namespace

Namespace PartnerAddress.Tier1
    Public MustInherit Class PartnerAddressCollection(Of T As PartnerAddressInstance)
         Implements ICoreTableCollection
    End Class

    Public MustInherit Class PartnerAddressInstance
        MustOverride Function Parent(Of T As {ICoreTableCollection, New}, S As {ICoreTableInstance, New})() As S
    End Class
End Namespace

Namespace Address.Tier2
    Public Class AddressCollection(Of T As AddressInstance)
        Inherits Address.Tier1.AddressCollection(Of T)
    End Class

    Public Class AddressInstance
        Inherits Address.Tier1.AddressInstance
    End Class
End Namespace

Namespace PartnerAddress.Tier2
Public Class PartnerAddressCollection(Of T As PartnerAddressInstance)
    Inherits Tier1.PartnerAddressCollection(Of T)
End Class

Public Class PartnerAddressInstance
    Inherits Tier1.PartnerAddressInstance

    Public Overrides Function Parent(Of T As {New, ICoreTableCollection}, S As {New, ICoreTableInstance})() As S

    End Function

    '*****************
    'This is what I want, but it's not allowed
    '*****************
    'Public Overrides Function Parent(Of T As {New, Address.Tier2.AddressCollection(Of S)}, S As {New, Address.Tier2.AddressInstance})() As S

    'End Function
End Class
End Namespace

有没有办法扩展Tier2.PartnerAddress中的Parent函数约束使其看起来像这样。

'*****************
'This is what I want, but it's not allowed
'*****************
Public Overrides Function Parent(Of T As {New, Address.Tier2.AddressCollection(Of S)}, S As {New, Address.Tier2.AddressInstance})() As S

End Function

而不是

Public Overrides Function Parent(Of T As {New, ICoreTableCollection}, S As {New, ICoreTableInstance})() As S

End Function

【问题讨论】:

    标签: .net vb.net generics inheritance


    【解决方案1】:

    您的问题归结为覆盖的工作方式。考虑以下示例:

    Public MustInherit Class AAA
      MustOverride Function ConvertToString(obj As MyObject) As String
    End Class
    Public Class BBB : Inherits AAA
      Public Overrides Function ConvertToString(obj As MyObject) As String 'this line
        Return String.Empty
      End Function
    End Class
    Public Class MyObject
    End Class
    Public Class MyInheritedObject : Inherits MyObject
    End Class
    

    现在显示this line,请注意您不能将MyObject 更改为MyInheritedObject。你的是泛型/类型,但同样的原则适用。这是每个 OOP,因此您的类需要具有与基类相同的方法签名。

    但是,您可以隐藏一个方法并在其上使用任何您想要的签名。

    【讨论】:

      【解决方案2】:

      您不能修改被覆盖类中的通用约束。您可以做的是添加泛型类型。作为一个简化的例子,而不是

      Public Class BaseClass
          Public Overridable Sub Something(Of T As ICoreTableCollection)()
      
          End Sub
      End Class
      
      Public Class SubClass
          Inherits BaseClass
          ' doesn't compile:
          'Public Overrides Sub Something(Of T As AddressCollection)()
      
          'End Sub
      End Class
      

      使用

      Public Class BaseClass(Of T As ICoreTableCollection)
          Public Overridable Sub Something()
      
          End Sub
      End Class
      
      Public Class SubClass(Of T As AddressCollection)
          Inherits BaseClass(Of T)
          Public Overrides Sub Something()
      
          End Sub
      End Class
      

      (这些示例使用以下类/接口)

      Public Interface ICoreTableCollection
      End Interface
      Public MustInherit Class AddressCollection
          Implements ICoreTableCollection
      End Class
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 1970-01-01
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多