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 |
namespace ConsoleApplication2 { class BaseClass { public int var = 1; public void BaseMethod() { this.var = 10; } } class SubClass : BaseClass { public int var = 2; public void SubMethod() { this.var = 20; } } class Program { static void Main(string[] args) { SubClass s = new SubClass(); // SubClassでの public int var = 2 をコメントアウトした場合 System.Console.WriteLine(s.var.ToString()); // 1 BaseClass.varが呼ばれる。 s.BaseMethod(); System.Console.WriteLine(s.var.ToString()); // 10 BaseClass.BaseMethodでBaseClass.varの値が変わる。 // コメントアウトしない場合 System.Console.WriteLine(s.var.ToString()); // 2 SubClass.varが呼ばれる。 s.BaseMethod(); System.Console.WriteLine(s.var.ToString()); // 2 BaseMethodではSubClass.varを変更できない。 // SubClassでの public int var = 2 をコメントアウトした場合 System.Console.WriteLine(s.var.ToString()); // 1 BaseClass.varが呼ばれる。 s.SubMethod(); System.Console.WriteLine(s.var.ToString()); // 20 BaseClass.varの値はSubMethodで変更している。 // コメントアウトしない場合 System.Console.WriteLine(s.var.ToString()); // 2 SubClass.varが呼ばれる。 s.SubMethod(); System.Console.WriteLine(s.var.ToString()); // 20 SubClass.varの値をSubMethodで変更している。 /* 継承しても内部でそれぞれクラスの有効範囲がある。 メソッドもフィールドも保有している。 BaseMethodではSubClass.varを変更できないが、SubMethodはBaseClass.varもSubClass.varも変更できる。 */ System.Console.ReadKey(); } } } |
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 |
namespace ConsoleApplication2 { class BaseClass { public int var = 1; public void BaseMethod() { this.var = 10; } } class SubClass : BaseClass { public int var = 2; public void SubMethod() { this.var = 20; } } class Program { static void Main(string[] args) { //変数の型を基底クラスにした場合。 BaseClass s = new SubClass(); // SubClassでの public int var = 2 をコメントアウトした場合 System.Console.WriteLine(s.var.ToString()); // 1 BaseClass.varが呼ばれる。 s.BaseMethod(); System.Console.WriteLine(s.var.ToString()); // 10 BaseClass.BaseMethodでBaseClass.varの値が変わる。 // コメントアウトしない場合 System.Console.WriteLine(s.var.ToString()); // 1 BaseClass.varが呼ばれる。 s.BaseMethod(); System.Console.WriteLine(s.var.ToString()); // 10 BaseClass.BaseMethodでBaseClass.varの値が変わる。 // SubClassでの public int var = 2 をコメントアウトした場合 System.Console.WriteLine(s.var.ToString()); // 1 BaseClass.varが呼ばれる。 //s.SubMethod(); 呼ぶことができない // コメントアウトしない場合 System.Console.WriteLine(s.var.ToString()); // 2 SubClass.varが呼ばれる。 //s.SubMethod(); 呼ぶことができない。 /* 変数の型を基底クラスとすると派生クラスのメソッドが呼べない */ System.Console.ReadKey(); } } } |
インスタンスを入れる変数の型 = 派生
フィールドは
基底を派生で上書きした場合、派生が呼ばれる
基底を派生で上書きしない場合、基底が呼ばれる。
基底クラスメソッドでは
基底クラスのフィールドのみ変更できる。
派生クラスメソッドでは
基底クラスのフィールドが変更でき、
派生クラスのフィールドも変更できる。
(Virtula-Overrideしていても挙動は同じ)
インスタンスを入れる変数の型 = 基底
フィールドは
基底を派生で上書きしても、常に基底が呼ばれる。
基底クラスメソッドでは
基底クラスのフィールドのみ変更できる。
派生クラスメソッドは
呼べない。
Virtual-Override
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 |
namespace ConsoleApplication2 { class BaseClass { public void Method() { System.Console.WriteLine(1); } } class SubClass : BaseClass { public void Method() { System.Console.WriteLine(2); } } class Program { static void Main(string[] args) { SubClass s = new SubClass(); s.Method(); //virtual-overrideを付けないと 2 //つけると 2 BaseClass b = new SubClass(); b.Method(); //virtual-overrideを付けないと 1 //つけると 2 /* virtual-overrideを付けるとインスタンスの型で呼んでいる。 派生クラスインスタンスからは派生クラス.メソッドしか呼べないので、事実上の上書きと同じ。*/ System.Console.ReadKey(); } } } |