2014-05-17 49 views
0

我有一个从非通用接口继承的通用接口。不知何故编译器不喜欢我如何做到这一点。我很感激任何帮助,想法如何完成这种继承的方式,编译器不抱怨。如何隐藏界面属性?

Public Interface IMessage 

    Property MessageType As UInt16 

    Property Payload As Object 

End Interface 


Public Interface IMessage(Of T) 
    Inherits IMessage 

    Shadows Property Payload As T 

End Interface 


Public Class Message(Of T) 
    Implements IMessage(Of T) ' <-- This line is highlighted in VS. 



    Public Property MessageType As UInt16 = 0 Implements IMessage(Of T).MessageType 

    Public Property Payload As T = Nothing Implements IMessage(Of T).Payload 

End Class 

类“消息”必须实现“属性有效载荷为对象”的 接口“消息对象”。实现属性必须匹配 'ReadOnly'或'WriteOnly'说明符。

回答

4
Shadows Property Payload As T 

通过使用阴影,你告诉这个负载特性故意没有基础属性相匹配的编译器。所以通用接口有两个属性,一个是As Object,另一个是As T。因此实现接口需要你实现它们两个:

Public Class Message(Of T) 
    Implements IMessage(Of T) 

    Public Property MessageType As UInt16 = 0 Implements IMessage(Of T).MessageType 
    Public Property Payload As T = Nothing Implements IMessage(Of T).Payload 
    Private Property Payload1 As Object Implements IMessage.Payload 
     Get 
      Return Payload 
     End Get 
     Set(value As Object) 
      Payload = CType(value, T) 
     End Set 
    End Property 
End Class 

这不是你想要做的,我敢肯定。因此,解决真正的问题可能是最好的,但非通用接口没有明显的用处。如果你有一个,那么这个片段会告诉你如何处理它。

+1

mmm。你是对的,因为这不是我希望的解决方案。通用的价值在于我可以对某些对象进行一些类型检查。非泛型的值是我可以定义带有IMessage的函数参数,然后传入IMessage(Of Book)和IMessage(Of Author)。那么..回到设计委员会。感谢你的回答。 –