Если интерфейс определяет Свойство ReadOnly, как разработчик может предоставить Setter этому свойству? - PullRequest
7 голосов
/ 10 июня 2011

Есть ли способ для реализации интерфейса, где свойство ReadOnly определено, чтобы сделать его полным Чтение / Запись Property?

Представьте себе, что я определяю интерфейс для предоставления ReadOnly Property (т. Е. Просто получатель для заданного значения):

Interface SomeInterface

    'the interface only say that implementers must provide a value for reading
    ReadOnly Property PublicProperty As String

End Interface

Это означает, что разработчики должны принять обязательство предоставить значение. Но я бы хотел, чтобы данный реализатор также позволял установить это значение. В моей голове это означало бы предоставление установщика Property как часть реализации, делая что-то вроде этого:

Public Property PublicProperty As String Implements SomeInterface.PublicProperty
    Get
        Return _myProperty
    End Get
    Set(ByVal value As String)
        _myProperty = value
    End Set
End Property

но это не скомпилируется, так как для компилятора VB разработчик больше не реализует интерфейс (потому что он больше не ReadOnly).

Концептуально, это должно работать, потому что, в конце концов, это просто означает Реализовать метод получения из Интерфейса и добавить метод установки. Для «обычных методов» это не составило бы проблем.

Есть ли какой-то способ сделать это, не прибегая к «скрытию интерфейса» или «самодельному» методу SetProperty(), а стиль, имеющий Property, ведет себя как свойство чтения / записи в реализациях?

Спасибо!

- ОБНОВЛЕНИЕ - (Я переместил этот вопрос в отдельный Вопрос ) Мой вопрос действительно: «почему это нельзя сделать в VB.NET», если в C # .NET действует следующее? »:

interface IPublicProperty
{
    string PublicProperty { get; }
}

с реализацией:

public class Implementer:IPublicProperty
    {
        private string _publicProperty;

        public string PublicProperty
        {
            get
            {
                return _publicProperty;
            }
            set
            {
                _publicProperty = value;
            }
        }
    }

Ответы [ 5 ]

6 голосов
/ 25 августа 2015

Теперь поддерживается в Visual Studio 2015.

Что нового в Visual Basic

Свойства интерфейса только для чтения

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

4 голосов
/ 14 июня 2011

В итоге я получил решение, которое соответствует моей цели:

  • пользователей, которые получают доступ через интерфейс, видят как минимум получателя
  • пользователей, которые могут получить доступ к реализации.Чтение и запись.

Я сделал это , "затеняя" реализованное свойство следующим образом:

'users who access through interface see only the Read accessor
Public ReadOnly Property PublicProperty_SomeInterface As String Implements SomeInterface.PublicProperty
    Get
        Return _myProperty
    End Get
End Property


'users who work with the implementation have Read/Write access
Public Property PublicProperty_SomeInterface As String
    Get
        Return _myProperty
    End Get
    Set(ByVal value As String)
        _myProperty = value
    End Set
End Property

Затем, в зависимости от того, как вы его используете, выможно сделать:

Dim implementorAsInterface As SomeInterface = New InterfaceImplementor()
logger.Log(implementor.PublicProperty) 'read access is always ok
implementor.PublicProperty = "toto" 'compile error : readOnly access

Dim implementor As InterfaceImplementor = New InterfaceImplementor()
implementor.PublicProperty = "toto" 'write access
4 голосов
/ 22 июля 2011

На уровне CLI нет ничего, что препятствовало бы реализации этого типа, и, как вы продемонстрировали, оно уже поддерживается C #.Язык VB.Net просто не поддерживает этот стиль реализации.

Знать, почему это немного сложно, так как решение на данный момент отменено почти на 10 лет.Очень вероятно, что в то время, когда была разработана реализация интерфейса, это был просто сайт.

0 голосов
/ 22 июня 2018

В Visual Basic, когда вы реализуете метод или свойство из интерфейса, вы можете изменить его имя и видимость.Вы можете использовать эту возможность для рассмотрения дела, о котором вы спрашиваете.До Visual Studio 2015 я часто делал это:

Интерфейс:

Public Interface SomeInterface
    ReadOnly Property SomeProperty As String
End Interface

Класс реализации:

Public Class SomeClass
    Implements SomeInterface

    Public Property SomeProperty As String
    Private ReadOnly Property SomeProperty_ReadOnly As String Implements SomeInterface.SomeProperty
        Get
            Return Me.SomeProperty
        End Get
    End Property
End Class

В результате SomeProperty доступен только для чтения при доступе через SomeInterface, но доступен для чтения и записи при доступе через SomeClass:

Dim c As New SomeClass
c.SomeProperty = "hello" 'Write via class OK
Dim s1 = c.SomeProperty 'Read via class OK

Dim i As SomeInterface = c
Dim s2 = i.SomeProperty 'Read via interface OK
i.SomeProperty = "greetings" 'Syntax Error, interface property is read-only
0 голосов
/ 10 июня 2011

Вы не можете сделать это, поскольку интерфейс требует реализации свойства ReadOnly.

Свойства не допускают перегрузки, поэтому нет способа реализовать не ReadOnly, а также ReadOnly.

Я бы посоветовал вам реализовать пользовательский установщик или удалить ReadOnly из интерфейса.

Без подробностей, почему вы хотите это сделать, трудно предложить лучшее решение

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