あなたが達成しようとしていることと、投稿したサンプル コードを考えると、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
基本的にプロパティ全体を public としてマークしますが、setter (または getter) により限定的なスコープを与えます。
あなたの場合の主な問題は、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
(setter のプライベート スコープに注意してください)。VB.NET は、基本クラスのプロパティをオーバーライドしているため、プロパティ全体がオーバーライドしているプロパティ (この場合はパブリック) と同じスコープを持つ必要があると主張しているため、これは機能しません。
基本クラスの抽象プロパティを保護しようとしても機能しません。基本クラスで宣言されているのと同じレベルのスコープでプロパティを実装する必要があるためです (つまり、保護されています)。通常、基本クラスの抽象定義を特定のスコープ レベルでオーバーライドしない場合、getter または setterにより制限的なスコープ レベルを与えることはできますが、より制限の少ないスコープ レベルを与えることはできません。
したがって:
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
(getter のパブリック スコープに注意してください)。public スコープが protected の全体的なプロパティ スコープよりも制限が少なく、さらに、基本クラスの抽象プロパティ宣言で定義されているスコープ レベルと同じでないため、機能しません。
あなたのクラスの設計があなたの質問で述べたとおりであれば、私は個人的に、「Java スタイル」のゲッター メソッドとセッターメソッドを使用します。これらのメソッドは、独自のスコープ レベルで個別に宣言できるからです。