トップ回答者
VB.net クラスの継承について理解できない点

質問
-
Visual Studio 2019, .Net Framework 4.7.2。
Class BaseClassでは、Property P1を隠蔽して使いたいためPrivateに設定しています。この使い方は、間違いではないと思います。
MustInheritなので実際のインスタンスの運用はPublic Class SubClassで行われます。
ところが、Class BaseClassの中のProperty P1がPrivateなためコンパイルエラーとなってしまい継承ができません。
コンパイルを通すために私が考えた解決案1:
Class SubClassの中にも Private Property P1 As Integer を書く。
× せっかく継承しているのに冗長な記述はしたくありません。
同 解決案2:
Class BaseClass内 Private Property P1 → Public Property P1
× 隠蔽されないので不可
何か他の解決方法がありますでしょうか。ヒントを教えて下さい。
Public MustInherit Class BaseClass
Private Property P1 As Integer 'このPrivate性を継承したい
Public Function get_Property() As String
Return P1.ToString
End Function
End Class
Public Class SubClass
Inherits BaseClass
Public Sub New(ByVal _p1 As Integer)
P1 = _p1 * 2 '←コンパイルが通らない
'.MainWindow.BaseClass.P1' は 'Private' であるため、このコンテキストではアクセスできません。
End Sub
End Class
回答
-
隠蔽して使いたいためPrivateに設定しています。この使い方は、間違いではないと思います。
継承先で利用したいのなら、Private を選択するのは誤りです。Protected を利用してください。
- 「Private」スコープは、自身からしかアクセスできません。
他のクラスや継承先クラスからはアクセスできません。 - 「Protected」スコープであれば、自身と継承先の両方からアクセスできます。
こちらは他のクラスからはアクセスできません。 - 「Public」スコープは、自身からも継承先からも他クラスからもアクセスできます。
- この他、「Protected Friend」スコープと「Friend」スコープがあります。
http://rucio.a.la9.jp/main/kiso/Scope.htm
また、他クラスから継承元のメンバーへのアクセスを隠したいという場合、さらに Shadows キーワードもしくは Overrides キーワードが併用されることがあります。これはメンバーそのものを隠蔽するのではなく、呼び出した時の動作を別の処理で覆い隠す振る舞いになります。Overrides するには、継承元のメンバーが Overridable である必要があります。Shadows は Overridable でなくても上書きできますが、Overrides と違って元の動作を書き換えるわけではありません。
- 編集済み 魔界の仮面弁士MVP 2023年3月15日 10:40
- 回答としてマーク huahi11112 2023年3月15日 22:38
- 「Private」スコープは、自身からしかアクセスできません。
すべての返信
-
隠蔽して使いたいためPrivateに設定しています。この使い方は、間違いではないと思います。
継承先で利用したいのなら、Private を選択するのは誤りです。Protected を利用してください。
- 「Private」スコープは、自身からしかアクセスできません。
他のクラスや継承先クラスからはアクセスできません。 - 「Protected」スコープであれば、自身と継承先の両方からアクセスできます。
こちらは他のクラスからはアクセスできません。 - 「Public」スコープは、自身からも継承先からも他クラスからもアクセスできます。
- この他、「Protected Friend」スコープと「Friend」スコープがあります。
http://rucio.a.la9.jp/main/kiso/Scope.htm
また、他クラスから継承元のメンバーへのアクセスを隠したいという場合、さらに Shadows キーワードもしくは Overrides キーワードが併用されることがあります。これはメンバーそのものを隠蔽するのではなく、呼び出した時の動作を別の処理で覆い隠す振る舞いになります。Overrides するには、継承元のメンバーが Overridable である必要があります。Shadows は Overridable でなくても上書きできますが、Overrides と違って元の動作を書き換えるわけではありません。
- 編集済み 魔界の仮面弁士MVP 2023年3月15日 10:40
- 回答としてマーク huahi11112 2023年3月15日 22:38
- 「Private」スコープは、自身からしかアクセスできません。