継承とnewキーワード

プログラミングC# 第6版 4.3.1


継承の仕方はC++とほぼ変わらないですね。

ひとつC++とは違い、注意する点がありました。

以下のコードです。

using System;

class CBase {
    public void Foo () {
        Console.WriteLine("CBase.Foo");
    }
}
class CClass : CBase {
    public void Foo () {
        Console.WriteLine("CClass.Foo");
    }
}

class Program {
    static void Main () {
        CClass cobj1 = new CClass();
        CBase cobj2 = cobj1;
        
        cobj1.Foo();
        cobj2.Foo();
    }
}

これは基底クラスのメソッドを派生クラスでも同名のメソッドを定義したケースですね。

しかしこれをコンパイルすると警告がでます。

$ csc main.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.

main.cs(9,14): warning CS0108: CClass.Foo()' は継承メンバー 'CBase.Foo()' を隠します。意図的に隠す場合はキーワード new を使用してください。
main.cs(4,14): (以前のエラーに関連する警告の位置)

警告を見ると、同名のメソッドを定義するならnewキーワード使えと書いてますね。試してみます。

using System;

class CBase {
    public void Foo () {
        Console.WriteLine("CBase.Foo");
    }
}

class CClass : CBase {
    // newキーワードを指定
    public new void Foo () {
        Console.WriteLine("CClass.Foo");
    }
}

class Program {
    static void Main () {
        CClass cobj1 = new CClass();
        CBase cobj2 = cobj1;
        
        cobj1.Foo();
        cobj2.Foo();
    }
}
$ main
CClass.Foo
CBase.Foo

動きました。しかしこのnewキーワードは何なのでしょうか。

本に説明がありました。どうやらプログラマの間違い防止用のキーワードといった感じみたいです。

つまり基底クラスのFooに対して派生クラスで間違えて上書きしてしまわないための処置みたいですね。

「Fooを上書きしてるぞ!本当にいいのか!?いいんであればコンパイラである俺様にわかるようにnewキーワードつけてね!」

っていうことですかね。