Учитывая то, что вы пытаетесь выполнить, и с примером кода, который вы опубликовали, VB.NET не позволит вам сделать это.
Обычно вы можете объявить свойство в VB.NET следующим образом:
Public Class qwqwqw
Public Property xyz() As String
Get
Return ""
End Get
Private Set(ByVal value As String)
'
End Set
End Property
End Class
По сути, помечая общее свойство как общедоступное, но предоставляя более ограничительную область для установщика (или получателя).
Основной проблемой в вашем случае является базовый класс MustInherit (т.е. абстрактный). Поскольку определяемое вами свойство помечено как MustOverride, вы не можете предоставить реализацию по умолчанию (т. Е. Она также является абстрактной), и это включает в себя контуры «Get» и «Set», следовательно, в зависимости от того, что в целом "область, которую вы даете этому объявлению абстрактного свойства, VB.NET заставит вас использовать эту область для и методов получения и установки в производных классах.
Наличие квалификатора ReadOnly в свойстве базового класса заставит все производные классы и реализации этого свойства также стать ReadOnly. Отключение спецификатора ReadOnly по-прежнему не будет работать, поскольку любая область, которую вы предоставляете абстрактному свойству, будет областью, которую вы должны применить как к установщикам, так и к получателям в производных реализациях.
Например:
Public MustInherit Class Parent
Public MustOverride Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Public Overrides Property Foo() As String
Get
'
End Get
Private Set(ByVal value As String)
'
End Set
End Property
End Class
(Обратите внимание на приватное определение на сеттере). Это не будет работать, поскольку VB.NET настаивает на том, что, поскольку вы переопределяете свойство базовых классов, все ваше свойство должно иметь ту же область действия, что и свойство, которое вы переопределяете (в данном случае, public).
Попытка сделать защищенное абстрактное свойство базового класса также не будет работать, поскольку тогда вам потребуется реализовать свойство на том же уровне области видимости, что и объявленный в вашем базовом классе (т.е. защищенном). Обычно, если не переопределять абстрактное определение базового класса определенным уровнем области видимости, вы можете задать для ограничителя или ограничителя more уровень ограничения, но вы не можете установить для него less ограничительный уровень охвата.
Таким образом:
Public MustInherit Class Parent
Protected MustOverride Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Protected Overrides Property Foo() As String
Public Get
'
End Get
Set(ByVal value As String)
'
End Set
End Property
End Class
(обратите внимание на публичное определение объема на получателе). Также не работает из-за того, что общедоступная область видимости является менее строгой, чем общая область действия защищенного свойства, и, более того, не имеет того же уровня области действия, который определен в объявлении абстрактного свойства базового класса.
Если бы дизайн ваших классов был таким, как вы упомянули в своем вопросе, я лично выбрал бы метод получения и установки "java-style" , так как они могут быть объявлены отдельно с их собственной областью видимости уровни.