none
VB.net クラスの継承について理解できない点 RRS feed

  • 質問

  • 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
    2023年3月15日 7:40

回答

  • 隠蔽して使いたいため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 と違って元の動作を書き換えるわけではありません

    https://learn.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/declared-elements/shadowing


    2023年3月15日 8:25

すべての返信

  • 隠蔽して使いたいため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 と違って元の動作を書き換えるわけではありません

    https://learn.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/declared-elements/shadowing


    2023年3月15日 8:25
  • コードを改良した結果、Protected スコープを使う方法が最適でした。
    Class BaseClass内 Private Property P1 → Protected Property P1
    簡単なことだったようですが、気が付きませんでした。
    魔界の仮面弁士さん、御回答まことにありがとうございました。
    2023年3月15日 22:42