Почему свойства интерфейса ReadOnly не могут быть переопределены в VB.NET, если они действительны в C # .NET? - PullRequest
8 голосов
/ 14 июня 2011

(это связано с другим вопросом )

Если вы определяете интерфейс, в котором есть свойство только с геттером (= ReadOnly в VB.NET), почему вы можете определить сеттер в реализации классов с C #, но не с VB ?

Я бы подумал, что он определен на уровне .NET, а не для конкретного языка.

Пример: для этого интерфейса

'VB.NET
Interface SomeInterface

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

End Interface

или

//C# code
interface IPublicProperty
{
    string PublicProperty { get; }
}

Это правильная реализация в C #:

public class Implementer:IPublicProperty
    {
        private string _publicProperty;

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

Но это недопустимо в VB.NET

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

ОБНОВЛЕНИЕ 2015/04/23

Оказывается, эта функция будет частью VB14! См. Функции языков в C # 6 и VB 14 и Новые функции языка в Visual Basic 14 :

Свойства интерфейса ReadOnly могут быть реализованы реквизитами ReadWrite. Это очищает причудливый угол языка. Посмотрите на этот пример:

Interface I
    ReadOnly Property P As Integer
End Interface


Class C : Implements I
    Public Property P As Integer Implements I.P
End Class

Ранее, если вы реализовывали свойство ReadOnly I.P, то Вы должны были реализовать это с помощью свойства ReadOnly. Теперь, когда ограничение было ослаблено: вы можете реализовать его с помощью чтения / записи собственность, если хотите. Этот пример происходит, чтобы реализовать его с чтение / запись autoprop, но вы также можете использовать свойство с getter и сеттер.

Ответы [ 2 ]

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

Будьте осторожны, предполагая, что VB.NET и C # - это один и тот же язык, на котором говорят с разным акцентом - это не так.

Поскольку VB.NET требует реализации члена интерфейса, чтобы иметь это предложение Implementsговоря, какой член он реализует.C # позволяет реализовывать элементы интерфейса явно (SORT OF, как VB.NET) или неявно (без VB.NET-эквивалента).Следовательно, фактическая C # версия этого

public class Implementer : IPublicProperty
{
    private string _publicProperty;

    string IPublicProperty.PublicProperty    // explicit implementation
    {
        get
        {
            return _publicProperty;
        }
        set
        {
            _publicProperty = value;
        }
    }
}

, а делает выдает ошибку:

ошибка CS0550: 'ConsoleApplication171.Implementer.ConsoleApplication171.IPublicProperty.PublicProperty.set 'добавляет средство доступа, не найденное в элементе интерфейса' ConsoleApplication171.IPublicProperty.PublicProperty '

0 голосов
/ 30 октября 2012

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

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

Концептуально, нет причин, по которым vb.net не может предложить аналогичную функцию и генерировать два (или даже три) разных свойства, как требуется для реализации интерфейсов. По крайней мере, в настоящее время, если член класса vb.net помечен как реализующий элемент интерфейса, ожидается, что он будет идеально соответствовать члену без переноса.

...