Реализация унаследованного универсального интерфейса в vb.Net - PullRequest
3 голосов
/ 29 ноября 2011

В нашем текущем проекте я использую универсальный интерфейс 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, содержащем:

  • параметр метода T типа IEntity вместо Log

Как мне обновить сигнатуру метода, чтобы T отображался как Log?

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Вы говорите об этом?

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
0 голосов
/ 01 декабря 2011

@ DanTao является правильным, если это является намерением.Однако, если вы просто предполагали, что имя параметра метода должно быть указано универсальным типом, это невозможно.

Однако вы можете указать любое имя, которое вам нравится, в методе реализации, поэтому вы можете использоватьLog если хотите, но вы не можете применить его (и какое-то правило FxCop предупредит вы не использовали такое же имя параметра, как указано в интерфейсе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...