Использование полиморфизма на элементе интерфейса - PullRequest
0 голосов
/ 15 мая 2009

Хорошо, это немного глупый вопрос, но я столкнулся с этим сегодня, и это несколько озадачивает меня, ПОЧЕМУ так будет.

Рассмотрим следующую структуру

    Public Class Employee
    Implements IPerson

    Private _MyManager As Manager
    Public Property MyManager() As Manager Implements IPerson.TheirLeader
        Get
            Return _MyManager
        End Get
        Set(ByVal value As Manager)
            _MyManager = value
        End Set
    End Property

End Class

Public Class Manager
    Implements IPerson, IAuthorityFigure

    Private _MyBoss As Boss
    Public Property MyBoss() As Boss Implements IPerson.TheirLeader
        Get
            Return _MyBoss
        End Get
        Set(ByVal value As Boss)
            _MyBoss = value
        End Set
    End Property

End Class

Public Class Boss
    Implements IPerson, IAuthorityFigure

    'Implementation code here...

End Class

Public Interface IPerson

    Property TheirLeader() As IAuthorityFigure

End Interface

Public Interface IAuthorityFigure
    'Stuff here...
End Interface

Вот мой вопрос: я хочу, чтобы каждый человек реализовывал интерфейс IPerson, будь то сотрудник, начальник или менеджер. Однако у каждого из них есть атрибут, который относится к их лидеру (у сотрудников есть менеджер, у менеджеров есть начальник и т. Д.). Каждая реализация их лидера может потенциально отличаться, кроме того, что они реализуют интерфейс IAuthorityFigure. Я хочу, чтобы интерфейс IPerson имел свойство для IAuthorityFigure, но он выдает ошибку компилятора для меня, когда я реализую этот b / c, IAuthorityFigure не того типа, что Boss или Manager (даже если они реализуют интерфейс).

Итак, я делаю что-то не так, или это ограничение использования интерфейсов по сравнению с абстрактными классами. Если это ограничение, кто-нибудь может объяснить, почему это так?

Спасибо!

Ответы [ 2 ]

1 голос
/ 15 мая 2009

Вы не делаете ничего плохого. Во всех выпущенных в настоящее время версиях Visual Basic (и C #) реализация метода, свойства или поля интерфейса должна точно соответствовать сигнатуре интерфейса. Там нет никакого способа переопределить это.

Лучшее, что вы можете сделать, - это иметь 2 свойства, одно из которых влияет на интерфейс, а другое используется для возврата фактической реализации.

Private _MyBoss As Boss
Public Property TheirLeader() As IAuthorityFigure Implements IPerson.TheirLeader
    Get
            Return MyBoss
    End Get
    Set(ByVal value As IAuthorityFigure)
            MyBoss = CType(value, IAuthorityFigure)
    End Set
End Property

Public Property MyBoss As Boos
    Get
            Return _MyBoss
    End Get
    Set(ByVal value As Boss)
            _MyBoss = value
    End Set
End Property
0 голосов
/ 15 мая 2009

Будет полезно, если вы перечислите код, определяющий интерфейс IPerson. Тем не менее, я думаю, вам нужно разыграть менеджера и босса как IAuthorityFigure вместо их классов.

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