やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#overrideとnewの違い

 親の型で子インスタンスを受け取り、メソッドを呼び出したとき、親・子どちらのメソッドが呼ばれるか。

成果物

情報源

コード

 親クラスのメソッドを子クラスにてoverride,newしてみる。

class Base {
    public virtual void V() => Console.WriteLine("V"); // virtual method
    public void I() => Console.WriteLine("I"); // instance method
}
class Super : Base
{
    public override void V() => Console.WriteLine("override!");
    public new void I() => Console.WriteLine("new!");
}

 Base bs = new Super();したとき、どちらのメソッドが呼ばれるか?

class Program
{
    static void Main(string[] args)
    {
        Base b = new Base(); b.V(); b.I();
        Console.WriteLine();

        Super s = new Super(); s.V(); s.I();
        Console.WriteLine();

        Base bs = new Super(); bs.V(); bs.I();
        Console.WriteLine();
    }
}

 実行結果は以下。

V
I

override!
new!

override!
I

 宣言した型が親だったとき、呼び出されるメソッドは親・子どちらか?

修飾子 呼出
override
new

所感

 前回のコードで私がやりたかったのはoverrideだった。なのにnewにしてしまっていた。

 そもそも、これは基礎レベル。私はまだこんなことすら理解していなかった。なんとなくキーワードは知っていたが、意味は分かっていなかった。やはり基礎から学習すべきだな。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux