2013-12-09 4 views
2

См. Приведенный ниже код. В Namespaces представляют собой DLL сегментирования, а не имен в одной и той же DLLРасширение общих ограничений

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, чтобы сделать его выглядеть следующим образом.

'***************** 
'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 

ответ

0

Ваша задача сводится к тому, как работает переопределение. Рассмотрим следующий пример:

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. У вас дженерики/типы, но применяются те же принципы. Это для ООП, поэтому ваш класс должен иметь подпись метода, идентичную базе.

Вы можете, однако, скрыть метод и использовать любую подпись, которую вы хотите на нем.

0

Вы не можете изменить общие ограничения в вашем переопределенном классе. Что вы можете сделать, это добавить общие типы. В упрощенном примере, вместо

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 
+0

Я не уверен, как это относится к моему образцу кода. – Ted

Смежные вопросы