Защищенный набор в VB.Net для свойства, определенного в интерфейсе - PullRequest
5 голосов
/ 02 марта 2010

У нас есть интерфейс, который может быть значительно упрощен как:

public interface IPersistable<T>
{
    T Id { get; }
}

Большинство мест, в которых реализован интерфейс, хотят иметь его, чтобы в этом свойстве был защищенный или закрытый набор, т. Е. В C #:

public class Foo : IPersistable<int>
{
    public int Id { get; protected set; }
}

Тем не менее, я не могу получить пример кода VB.Net для компиляции, который следует той же схеме, пока еще реализуется интерфейс, поэтому:

Public Class Foo
    Implements IPersistable(Of Integer)

    Public Property Id() As Integer Implements IPersistable(Of Integer).Id
        Get
            Throw New NotImplementedException()
        End Get
        Protected Set(ByVal value As Integer)
            Throw New NotImplementedException()
        End Set
    End Property
End Class

... не скомпилируется, но это будет:

Public Class Foo
    Public Property Id() As Integer
        Get
            Throw New NotImplementedException()
        End Get
        Protected Set(ByVal value As Integer)
            Throw New NotImplementedException()
        End Set
    End Property
End Class

Я ценю, что этот пример слишком тривиален, и, возможно, его лучше реализовать с помощью защищенных конструкторов, но мне интересно, можно ли это сделать таким образом?

[РЕДАКТИРОВАТЬ:] ... и, очевидно, если тип хочет использовать XMLSerialization, тогда свойства должны быть общедоступными для чтения / записи, или для типов потребуются собственные сериализаторы, написанные для каждого.

По сути, я вижу, что интерфейс должен определять минимальную доступность, но VB интерпретирует это как точную доступность?

Ответы [ 4 ]

6 голосов
/ 02 марта 2010

Да, вам придется буквально реализовать интерфейс. Возможный обходной путь - повторно опубликовать свойство в классе с другим именем:

Public Class Foo
  Implements IPersistable(Of Integer)
  Private m_Id As Integer

  Public ReadOnly Property Id() As Integer Implements IPersistable(Of Integer).Id
    Get
      Return m_Id
    End Get
  End Property

  Protected Property IdInternal() As Integer
    Get
      Return m_Id
    End Get
    Set(ByVal value As Integer)
      m_Id = value
    End Set
  End Property
End Class

Объявите свойство Overridable, если вы собираетесь переопределить его в производных классах.

1 голос
/ 11 августа 2016

Начиная с Readonly Interface Properties"> Visual Basic 14 , ваш первый пример кода VB компилируется нормально.

1 голос
/ 02 марта 2010

Это в настоящее время не поддерживается языком и не будет поддерживаться в Visual Basic 10 (т.е. версия с Visual Studio 2010). Для этого есть элемент списка желаний . До тех пор, обходные пути, такие как предложенные nobugz, являются единственным вариантом.

0 голосов
/ 28 июня 2012

Свойства интерфейса могут быть реализованы только соответствующими свойствами класса. Это верно как для vb.net, так и для C #. Разница между этими двумя языками заключается в том, что неявная функция реализации интерфейса в C # автоматически определяет свойство только для чтения или только для записи для реализации интерфейса, если доступно общедоступное свойство чтения-записи с тем же именем.

...