Почему интерфейс переопределяет определение класса и нарушает инкапсуляцию класса? Я включил два примера ниже: один в C # и один в 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
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.