クラスの継承(inheritance)は、オブジェクト指向プログラミング(OOP,Object Oriented Programming)の3本柱の1つといわれています。
有るクラスを、他のクラスに継承するプログラムは(内容を考えなければ)簡単です。 クラス宣言の時に、継承したいクラスをコロン(:)でつなぎます。
class クラス名 : 継承元クラス名 {...}継承元のクラスを「基本クラス」、継承先のクラスを「派生クラス」といいます。
派生クラスは、一つの基本クラスからしか継承できません。C/C++とは、この点で異なります。
派生クラスでは、基本クラスのメンバのうちpublicなものと、protectedなものにアクセスできます。privateなメンバにはアクセスできません。
では、簡単なサンプルを見てみましょう。
// inheritance01.cs using System; class MyClass { protected int x; public void show() { Console.WriteLine("x = {0}", x); } public int setx { set { x = value; } } } class MyChild : MyClass { int y; public void show2() { Console.WriteLine("x = {0}, y = {1}", x, y); } public int sety { set { y = value; } } } class inheritance01 { public static void Main() { MyChild mc = new MyChild(); mc.setx = 10; mc.sety = 20; mc.show(); mc.show2(); Console.Write("\n"); MyClass myclass = new MyClass(); myclass.setx = 100; myclass.show(); } }MyChildクラスは、MyClassクラスから派生した派生クラスです。
MyClassクラスには、protectedなxインスタンスフィールドがあります。
また、publicなshowメソッドがあり、xの値を表示します。
setxというpublicなプロパティもあります。
一方、MyChildクラスには、privateなインスタンスフィールドyと、publicな show2メソッドがあります。このメソッドの中で、MyClassクラスのメンバのxに アクセスしています。xはprotectedなので、継承先でも見えるのですね。
さて、MyClassクラスのsetyプロパティは、protectedではなく、publicにしてあります。 これは、MyClidクラスからは見えても、それ以外からは見えないため、使いようが無いのでpublicにしてあります。protectedなメンバは、継承先でもprotectedであり、publicなメンバは継承先でもpublicとなります。
Mainメソッドでは、まずMyChildクラスのインスタンスを生成しています。
MyChildクラスには、setxプロパティを宣言していませんがmc.setx = 10;のように、 基本クラスのプロパティを使っています。また、showメソッドも定義していませんが mc.show();のように使っています。
次に基本クラスのMyClassのインスタンスを生成しています。基本クラスも今まで通り 普通に使えます。しかし、当然ながら継承先のことはわからないので、myclass.show2(); などとはできません。
では、実行結果を見てみましょう。
Update 12/Sep/2006 By Y.Kumei