Dado lo que está tratando de lograr, y con el código de muestra que publicó, VB.NET no le permitirá hacerlo.
Ordinariamente, se puede declarar una propiedad en VB.NET, así:
Public Class qwqwqw
Public Property xyz() As String
Get
Return ""
End Get
Private Set(ByVal value As String)
'
End Set
End Property
End Class
marca Básicamente, la propiedad en general como públicos, pero dando un alcance más restrictiva a la incubadora (o captador).
El problema principal en su caso es la clase base MustInherit (es decir, abstracta). Como la propiedad que está definiendo allí está marcada como MustOverride, no puede proporcionar una implementación predeterminada (es decir, también es abstracta), y esto incluye los contornos "Obtener" y "Establecer", por lo tanto, cualquiera que sea el "general". "alcance que le da a esta declaración de propiedad abstracta, VB.NET le obligará a usar este alcance para ambos los getters y setters dentro de las clases derivadas.
Tener el calificador ReadOnly en la propiedad de la clase base obligará a todas las clases derivadas y las implementaciones de esta propiedad a ser solo ReadOnly. Dejar el calificador ReadOnly aún no funcionará, ya que cualquier alcance que otorgue a la propiedad abstracta será el alcance que debe aplicar tanto a los establecedores como a los getters en las implementaciones derivadas.
Por ejemplo:
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
(Nota del alcance privado en la incubadora). Esto no funcionará, ya que VB.NET insiste en que, dado que está anulando la propiedad de las clases base, toda su propiedad debe tener el mismo alcance que la propiedad que está anulando (en este caso, pública).
Intentar proteger la propiedad abstracta de la clase base tampoco funcionará, ya que entonces se le solicitará que implemente la propiedad en el mismo nivel de alcance que se ha declarado en su clase base (es decir, protegida). Normalmente, cuando no anula la definición abstracta de una clase base con un nivel de ámbito específico, puede otorgarle a un getter 0 un más nivel de alcance restrictivo, pero no puede otorgarle un nivel de alcance restrictivo menos.
Por lo tanto:
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
(Nota del alcance público en el captador). Tampoco funciona debido a que el alcance público es menos restrictivo que el alcance general de la propiedad protegido y, además, no tiene el mismo nivel de alcance definido en la declaración de propiedad abstracta de la clase base.
Si el diseño de sus clases es como usted menciona en su pregunta, yo personalmente, iría con un captador "al estilo de Java" y colocador métodos, ya que entonces se pueden declarar por separado con sus propios niveles de alcance.
No creo que se puede hacer eso en VB.NET (que alguien está a punto de demostrar que estoy equivocado) ¿cuál es su razonamiento para necesitar para hacerlo así, si es una de sus propias clases, seguramente esto indica un error en el diseño ... ¿o quizás las interfaces se habrían usado más? – spacemonkeys
En mi caso, la propiedad es efectivamente cierta para la mayoría de los subtipos, pero hay una donde dicha propiedad es editable. En este momento estoy usando comprobaciones de tipo, pero una propiedad invalidada sería más apropiada. –