C#_基底クラスの隠蔽

派生クラスで、基底クラスの public メンバと同名のメンバを再定義すると
基底クラスのメンバが新しく追加されたメンバに隠れる。

派生クラス基底クラス同じシグネチャのメンバを宣言することを
基底クラスのメンバを隠蔽する」という。

 

基底クラスのメンバを隠蔽した場合、
メンバの実体が 1 つに収束するわけではなく、基底クラスと派生クラスで
同じメンバが重複して存在するようになる。

メンバ:クラスやオブジェクトの持つ変数や関数などの要素。メンバ変数・メンバ関数
シグネチャ:メソッドの名前・引数の数やデータ型・返り値の型などの組み合わせのこと。

 

ex )

親クラス

    class BaseHoge
    {
        public void BaseHoge01()
        {
            Console.WriteLine("B1");
        }
    }

 

子クラス

    class SubHoge : BaseHoge
    {
        public void BaseHoge01()
        {
            Console.WriteLine("Sub01");
        }
    }

SubHoge クラスで BaseHoge クラスの BaseHoge01 を隠蔽している

SubHoge クラスのインスタンス
BaseHoge で宣言された BaseHoge01 メンバと
SubHoge で宣言された BaseHoge01 メンバの両方を持つ

 

SubHoge クラスのオブジェクトから BaseHoge01 メンバに
アクセスした場合、オブジェクトの型によって
どちらの BaseHoge01 メンバを利用するかが決定される

BaseHoge 型の変数であれば、BaseHoge の BaseHoge01 メンバが、
SubHoge 型 ( または SubHoge クラスから派生する型 ) の変数であれば、
SubHoge の BaseHoge01 メンバと解釈される。
「継承 と オーバーライド のMemo コード」記事参照。

 

new 修飾子

基底クラスのメンバを隠蔽するコードをコンパイルすると、

「 SubHoge.BaseHoge01() は
継承されたメンバー BaseHoge.BaseHoge01() を非表示にします。
非表示にする場合はキーワード new を使用して下さい」

という警告が発生する。
知らずに基底クラスのメンバを隠蔽すると、意図しない動作
引き起こす可能性があるために警告を出している

 

意図して基底クラスのメンバを隠蔽する場合は明示する
明示的に基底クラスのメンバを隠蔽するには new 修飾子をつける

    public new void BaseHoge01

この new はメンバ宣言を修飾する修飾子の一種。
同じ修飾子である public 修飾子との順番は無関係だが、
一般には public などのアクセス修飾子を先に書く。

 

 

Memo

・base を使って隠蔽されたメンバを呼びだせる。
・絶対に継承されたくない時は親に sealed をつけると継承を禁止できる。
C# では一つのクラスしか継承できない。二つ以上継承しようとするとコンパイルエラー。
・インターフェースはこの制限はない。

 

  

 

こちらから。
http://www.wisdomsoft.jp/359.html
https://ufcpp.net/study/csharp/oo_inherit.html?sec=conceal#conceal
http://e-words.jp/w/%E3%83%A1%E3%83%B3%E3%83%90.html
http://e-words.jp/w/%E3%82%B7%E3%82%B0%E3%83%8D%E3%83%81%E3%83%A3.html

以上。