クラスを利用する最大の理由の一つに「クラスは継承することができる」ということがあげられます。もし、クラスの継承ができなければGUIのWindowsプログラムの作成は大変面倒なものになります(後の章で自ずとわかります)。
クラスの継承(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