在我们当前的项目中,我使用的是由所有其他服务接口继承的通用接口iService
。例如IService
被ILogService
继承。
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
是方法参数的名称,不是泛型类型参数。也可能是foo
或bar
。在每种情况下,T
的类型都是IEntity
。
如果这里的意图是Save
和Remove
都应该接受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规则会警告你没有使用与接口中指定的相同的参数名)。