Как вы обращаетесь с общими участниками при работе с интерфейсами? - PullRequest
0 голосов
/ 30 сентября 2011

Итак, я проделал огромную работу, пытаясь создать интерфейс для общего набора классов. Идея состояла в том, чтобы создать интерфейс, который каждый класс мог бы использовать в наборе, но в конечном счете каждый класс отличается. Оказывается, интерфейсы не любят общих членов. Что я пробовал:

Public Interface ISomeInterface
Shared Property Meta() as Object
End Interface


Public Class A

Implements ISomeInterface
Shared Public Property Meta() as Object Implements ISomeInterFace.Meta
'Set/get methods
End Propery

Public Function Haduken() as Object
'perform Haduken
End Function
End Class


Public Class B

Implements ISomeInterface
Shared Public Property Meta() as Object Implements ISomeInterFace.Meta
'Set/get methods
End Propery

Public Function SonicBoom() as Object
'perform sonic boom
End Function
End Class

Очевидно, что если бы я сделал свою домашнюю работу по этому вопросу, я бы знал, что общие члены не могут использоваться в интерфейсах. Должен ли я просто оставить отдельные классы полностью ответственными за обработку своих общих членов? Есть ли другой способ свести к минимуму связь с общими участниками? Theres приблизительно 20 или около того классов, которые будут реализовывать единый интерфейс. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Самый простой способ обойти это - иметь Private реализацию интерфейса, который просто перенаправляет на Shared член

Public Shared Property Meta As Object
  ' Get / Set methods
End Property

Private Property MetaImpl() as Object Implements ISomeInterFace.Meta
  Get 
    return Meta
  End Get
  Set
    Meta = Value
  End Set
End Propery

Этот шаблон позволяет вам поддерживать тот же открытый API-интерфейси до сих пор реализовать интерфейс.

0 голосов
/ 02 октября 2011

Если идея заключается в том, что каждая реализация интерфейса должна использовать свою собственную общую переменную, подход JaredPar является правильным.Если идея заключается в том, что все пользователи интерфейса должны видеть одну и ту же общую переменную, независимо от того, какой экземпляр у них есть (если есть), правильным подходом является создание класса с именем, похожим на интерфейс, и использование общего членаэтот класс.Это подход, используемый, например, Enumerable .Empty или Comparer .Default.

...