Заставить несколько классов иметь определенного общего члена - PullRequest
0 голосов
/ 08 мая 2018

Я уже ищу часы, но я не могу найти какое-либо решение или даже возможный способ, который подходит. Мне нужен способ обеспечить, чтобы несколько классов имели общего члена. Эти классы не могут наследоваться другим классом, потому что они являются классами модели данных сущностей, и я работаю над частичным файлом класса рядом с автоматически генерируемыми файлами.

Я пытался использовать интерфейс, но интерфейсы не предоставляют возможность объявить участника общим.

Моя попытка была такой:

Public Interface IInterfaceA
    ReadOnly Property PropA as String
End Interface

Public Partial Class ClassA
    Implements IInterfaceA

    Public Shared ReadOnly Property SPropA As String
        Get
            Return "FixedValueStringForClassA"
        End Get
    End Property

    Public ReadOnly Property PropA As String Implements IInterfaceA.PropA
        Get
            Return SPropA
        End Get
    End Property
End Class 

Public Partial Class ClassB
    Implements IInterfaceA

    Public Shared ReadOnly Property SPropA As String
        Get
            Return "FixedValueStringForClassB"
        End Get
    End Property

    Public ReadOnly Property PropA As String Implements IInterfaceA.PropA
        Get
            Return SPropA
        End Get
    End Property
End Class 

Так что я могу позвонить PropA Участнику, когда получу, например, массив типов, который реализует IInterfaceA.

Но моя первая реализация не применяет общее свойство, только обычное свойство. Чтобы вызвать обычное свойство, мне нужен экземпляр этого типа, но я не так ищу.

Может быть, есть другое решение этой проблемы.

1 Ответ

0 голосов
/ 09 мая 2018

К сожалению, вы не можете заставить класс реализовать общий член. Тем не менее, вы МОЖЕТЕ совместно использовать методы расширения из модуля.

У меня недавно была похожая проблема с необходимостью делиться функциями с несколькими классами, но я все еще мог запускать их как этот класс. Что я решил, используя методы расширения.

В основном, как это работает, модуль расширяет все объекты, которые реализуют интерфейс, который может быть удобно включен в модуль, этот интерфейс будет включать в себя все, к чему модулю потребуется доступ из вызывающего класса, и модуль будет включать в себя все, что ему нужно быть разделенным между всеми классами

Public Module SharedProp
    Dim PropA As String

    <Extension()>
    Public Function GetPropA(Of T As IInterfaceA)(this As T) As String
        Return PropA
    End Function

    <Extension()>
    Public Sub SetPropA(Of T As IInterfaceA)(this As T, value As String)
        PropA = value
    End Function

    Public Interface IInterfaceA
        Property PropA As String
    End Interface
End Module

Пока модуль включен, любой класс, который влияет на ваш интерфейс, будет иметь доступ к методам расширения модуля, которые, в свою очередь, имеют доступ к неявно разделяемым элементам модуля

Imports SharedProp

Public Partial Class ClassA
    Implements IInterfaceA

    Public Property PropA As String Implements IInterfaceA.PropA
        Get
            Return Me.GetPropA()
        End Get
        Set(value As String)
            Me.SetPropA(value)
        End Set
    End Property
End Class

Public Partial Class ClassB
    Implements IInterfaceA

    Public Property PropA As String Implements IInterfaceA.PropA
        Get
            Return Me.GetPropA()
        End Get
        Set(value As String)
            Me.SetPropA(value)
        End Set
    End Property
End Class

Надеюсь, это поможет решить вашу проблему!

РЕДАКТИРОВАТЬ: общий для класса вместо интерфейса

Public Module SharedProp
    Dim PropA As Dictionary(Of Type, String)

    <Extension()>
    Public Function GetPropA(Of T As IInterfaceA)(this As T) As String
        If PropA.ContainsKey(GetType(T)) Then
            Return PropA(T)
        Else
            Return Nothing
    End Function

    <Extension()>
    Public Sub SetPropA(Of T As IInterfaceA)(this As T, value As String) As String
        If PropA.ContainsKey(GetType(T) Then
            PropA(T) = value
        Else
            PropA.Add(GetType(T), value)
        End If
    End Function

    Public Interface IInterfaceA
        Property PropA As String
    End Interface
End Module
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...