在vb.Net中实现继承泛型接口



在我们当前的项目中,我使用的是由所有其他服务接口继承的通用接口iService。例如IServiceILogService继承。

ILogService接口然后由LogService实现如下:

Public Interface IService(Of T)
    Sub Save(ByVal T As IEntity)
    Sub Remove(ByVal T As IEntity)
    Function FindBy(ByVal Id As Guid) As T
    Function FindAll() As IEnumerable(Of T)
End Interface
Public Interface ILogService
    Inherits IService(Of Log)

    Function FindLogsByOwner(ByVal Owner As Guid, ByVal visibility As LogVisibility) As IList(Of Log)
    Function FindAllLogsByVisibility(ByVal visibility As LogVisibility) As IList(Of Log)
    Function FindAllLogsByType(ByVal type As LogType) As IList(Of Log)
End Interface
Public Class LogService
    Implements ILogService

    Public Function FindAll() As System.Collections.Generic.IEnumerable(Of Model.CSLS.Log) Implements Infrastructure.Domain.IService(Of Model.CSLS.Log).FindAll
    End Function
    Public Function FindBy(Id As System.Guid) As Model.CSLS.Log Implements Infrastructure.Domain.IService(Of Model.CSLS.Log).FindBy
    End Function
    Public Sub Remove(T As Infrastructure.Domain.IEntity) Implements Infrastructure.Domain.IService(Of Model.CSLS.Log).Remove
    End Sub
    Public Sub Save(T As Infrastructure.Domain.IEntity) Implements Infrastructure.Domain.IService(Of Model.CSLS.Log).Save
    End Sub
    Public Function FindAllLogsByType(type As Model.CSLS.LogType) As System.Collections.Generic.IList(Of Model.CSLS.Log) Implements Model.CSLS.ILogService.FindAllLogsByType
    End Function
    Public Function FindAllLogsByVisibility(visibility As Model.CSLS.LogVisibility) As System.Collections.Generic.IList(Of Model.CSLS.Log) Implements Model.CSLS.ILogService.FindAllLogsByVisibility
    End Function
    Public Function FindLogsByOwner(Owner As System.Guid, visibility As Model.CSLS.LogVisibility) As System.Collections.Generic.IList(Of Model.CSLS.Log) Implements Model.CSLS.ILogService.FindLogsByOwner
    End Function
End Class

需要帮助:我试图理解,当我实现ILogService接口时,我仍然得到LogService类中的函数/子,包含:

  • 类型为IEntity而不是Log的方法参数T

如何更新方法签名使T显示为Log ?

我做错了什么?

你是在说这些吗?

Sub Save(ByVal T As IEntity)
Sub Remove(ByVal T As IEntity)

这很令人困惑,因为在上述方法中T是方法参数的名称,不是泛型类型参数。也可能是foobar。在每种情况下,T的类型都是IEntity

如果这里的意图是SaveRemove都应该接受T类型的参数,但T类型必须实现IEntity,那么您将如何表达:

Public Interface IService(Of T As IEntity)
    Sub Save(ByVal entity As T)
    Sub Remove(ByVal entity As T)
    Function FindBy(ByVal Id As Guid) As T
    Function FindAll() As IEnumerable(Of T)
End Interface

如果这是意图的话,@DanTao是正确的。但是,如果您只是想让泛型类型指定方法参数的名称,那么这是不可能的。

然而,你可以在实现方法中指定任何你喜欢的名字,所以如果你想的话,你可以使用Log,但是你不能强制它(一些FxCop规则会警告你没有使用与接口中指定的相同的参数名)。

最新更新