クラスを利用する最大の理由の一つに「クラスは継承することができる」ということがあげられます。もし、クラスの継承ができなければ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