1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); //動的な型=インスタンスの型。a.GetType() //静的な型=変数の型。typeof(a) //静的な型 / 動的な型 A a1 = new A(); B b1 = new B(); A a2 = new B(); MessageBox.Show(a1.GetType().ToString()); //A MessageBox.Show(b1.GetType().ToString()); //B MessageBox.Show(a2.GetType().ToString()); //B //a2はAの型の変数だけど、インスタンスはBが入っている。 MessageBox.Show(typeof(A).ToString()); //A MessageBox.Show(typeof(B).ToString()); //B //変数同士の代入時、静的な型で判断 //基底の変数に派生の変数を入れる=アップキャスト。(安全) //派生の変数に基底の変数を入れる=ダウンキャスト。(不可) //メソッドは通常静的な型で呼ばれる。 MessageBox.Show(a1.say()); //A MessageBox.Show(b1.say()); //B MessageBox.Show(a2.say()); //A //Virtualは動的な型でメソッドが呼ばれる。 //Virtualメソッドの再定義Override C c1 = new C(); D d1 = new D(); C c2 = new D(); MessageBox.Show(c1.say());//C MessageBox.Show(d1.say());//D MessageBox.Show(c2.say());//D //コンストラクタは、基底クラスが呼ばれ、派生クラスが呼ばれる。 } } public class A { public string say() { return "A"; } } public class B : A { public string say() { return "B"; } } public class C { public virtual string say() { return "C"; } } public class D : C { public override string say() { return "D"; } //virtualメソッドじゃないとoverrideできない。 } } |