親の型で子インスタンスを受け取り、メソッドを呼び出したとき、親・子どちらのメソッドが呼ばれるか。
成果物
情報源
コード
親クラスのメソッドを子クラスにて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
にしてしまっていた。
そもそも、これは基礎レベル。私はまだこんなことすら理解していなかった。なんとなくキーワードは知っていたが、意味は分かっていなかった。やはり基礎から学習すべきだな。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- SQLite 3.29.0 ※
- C# dotnet 3.0.100 ※
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux