.NET: Проблема интерфейса VB. net Getter Only Interface

Почему интерфейс переопределяет определение класса и нарушает инкапсуляцию класса? Я включил два примера ниже: один в C # и один в VB.net ?

VB.net

Module Module1

    Sub Main()
        Dim testInterface As ITest = New TestMe
        Console.WriteLine(testInterface.Testable) ''// Prints False
        testInterface.Testable = True             ''// Access to Private!!!
        Console.WriteLine(testInterface.Testable) ''// Prints True

        Dim testClass As TestMe = New TestMe
        Console.WriteLine(testClass.Testable)     ''// Prints False
        ''//testClass.Testable = True             ''// Compile Error
        Console.WriteLine(testClass.Testable)     ''// Prints False
    End Sub

End Module

Public Class TestMe : Implements ITest
    Private m_testable As Boolean = False
    Public Property Testable As Boolean Implements ITest.Testable
        Get
            Return m_testable
        End Get
        Private Set(ByVal value As Boolean)
            m_testable = value
        End Set
    End Property
End Class

Interface ITest

    Property Testable As Boolean

End Interface

C #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InterfaceCSTest
{
    class Program
    {
        static void Main(string[] args)
        {
            ITest testInterface = new TestMe();
            Console.WriteLine(testInterface.Testable);
            testInterface.Testable = true;
            Console.WriteLine(testInterface.Testable);

            TestMe testClass = new TestMe();
            Console.WriteLine(testClass.Testable);
            //testClass.Testable = true;
            Console.WriteLine(testClass.Testable);
        }
    }

    class TestMe : ITest
    {
        private bool m_testable = false;
        public bool Testable
        {
            get
            {
                return m_testable;
            }
            private set
            {
                m_testable = value;
            }
        }
    }

    interface ITest
    {
        bool Testable { get; set; }
    }
}

Более конкретно

Как мне реализовать интерфейс в VB.net , который позволит использовать частный установщик . Например, в C # я могу объявить:

class TestMe : ITest
{
    private bool m_testable = false;
    public bool Testable
    {
        get
        {
            return m_testable;
        }
        private set //No Compile Error here!
        {
            m_testable = value;
        }
    }
}

interface ITest
{
    bool Testable { get; }
}

Однако, если я объявлю свойство interface как только для чтения в VB.net , я не смогу создать сеттер. Если я создам файл VB. net interface как простое старое свойство , тогда объявления интерфейсов будут нарушать мою инкапсуляцию .

Public Class TestMe : Implements ITest
    Private m_testable As Boolean = False
    Public ReadOnly Property Testable As Boolean Implements ITest.Testable
        Get
            Return m_testable
        End Get
        Private Set(ByVal value As Boolean) ''//Compile Error
            m_testable = value
        End Set
    End Property
End Class

Interface ITest

    ReadOnly Property Testable As Boolean

End Interface

Итак, мой вопрос, как мне определить Только геттер Интерфейс в VB.net с правильной инкапсуляцией ?

Я подумал, что первый пример был бы лучшим методом. Однако создается впечатление, что определения интерфейса преобладают над определениями классов. Поэтому я попытался создать свойство только для получения (только для чтения) , как в C # , но оно не работает для VB.net . Может это просто ограничение языка?

Обновление

В соответствии с комментарием Ханса Пассанта я отправил найденный запрос функции: https://connect.microsoft.

17
задан unutbu 11 January 2011 в 20:55
поделиться