C#でクラスを作成する時に「クラスを継承」して新しいクラスを作成することができます。クラスの継承はオブジェクト指向において重要な概念なので、押さえておく必要があります。この記事ではそんなクラスの継承の基本的な考え方と、サンプルコードから継承の使い方を解説します。
クラスの継承とは、特定のクラスの性質を受け継いで別のクラスを作成することであります。重要な点は「クラスの性質を受け継げる」というところですね。継承元クラスを「基底クラス」、継承して作成されたクラスを「派生クラス」と呼んだりもします。
継承の基礎知識
クラスの性質を受け継いで、別のクラスを作成することを「継承」と呼んでいますが、継承元はほかにも「スーパークラス」と読んだりしており、継承されたクラスを「サブクラス」と呼んだりもします。
一般的には「BはAクラスを継承する」や「AクラスはBクラスからの派生クラスである」と言ったりもします。継承については、「車」を例にして継承を考えてみると分かりやすいと思いますので、簡単に解説していきます。
車は「基底」、バスは「派生」
たとえば「車」と「バス」の関係をみていきます。「車」がスーパークラスで「バス」が派生クラスであるとします。「車」にはアクセルやブレーキが機能するという一般的な特徴を持っています。
その一方でバスは車と同じように、アクセルとブレーキといった基本機能は備えているものの、車内アナウンスや運賃の受け取り・支払いなど車とは異なる性質も持ち合わせています。このような場合は以下が成り立つといえます。
- 「バス」は「車」の派生である
- 「バス」は「車」を継承する
- 「車」は「バス」の基底である
このように「継承」とは、「他方がもう一方を包含する」ような場合で使用することができます。「車」はスーパークラスであり、「バス」はサブクラスであるといえます。C#では以下のように継承を記載します。
class 派生クラス : 基底クラス
{
//派生クラスの記述
}
本来は「(アクセス修飾子)class (派生クラス): (基底クラス)」となります。具体的なソースコードの書き方については、次の項目にてサンプルコードを交えて解説していきます。
継承のサンプルコード
それではクラスを継承させるためのサンプルコードを書いていきます。新規のコンソールアプリケーションを作成して、以下のアプリケーションを作成してみましょう。
using System;
namespace App01
{
class Program
{
static void Main(string[] args)
{
Bus bus = new Bus();
//基底クラスの処理
bus.Forward();
bus.Forward();
bus.Stop();
Console.ReadLine();
}
// 車クラス
public class Car
{
//走るメソッド
public void Forward()
{
Console.WriteLine("前に進む。");
}
//止まるメソッド
public void Stop()
{
Console.WriteLine("止まる。");
}
}
//バスクラス
public class Bus : Car
{
}
}
}
上記のサンプルはスーパークラスを「Car」とし、サブクラスを「Bus」クラスとしました。先ほどの「バスは車の派生である」という概念をそのまま表した感じですね。上記のサンプルを実行すると以下のように表示されます。
前に進む。
前に進む。
止まる。
これが一番シンプルな継承の形といえるでしょう。上記のサンプルは、バスクラスは車クラスを継承して、バスクラス独自の性質を加えていないパターンになります。もちろん、バスクラス独自の性質も加えることが可能です。
新しいアプリケーションを作成して以下のようにしてみましょう。
using System;
namespace App02
{
class Program
{
static void Main(string[] args)
{
Bus bus = new Bus();
//バスの一連の流れを表している
bus.Forward(); //動き出す
bus.Stop(); //信号で止まる
bus.Forward(); //動き出す
bus.Announce(); //停車する車内放送をする
bus.Stop(); //停留所で止まる
bus.Change(); //お釣りを払う
bus.Announce(); //発射する車内放送をする
bus.Forward(); //動き出す
Console.ReadLine();
}
// 車クラス
public class Car
{
//走るメソッド
public void Forward()
{
Console.WriteLine("前に進む。");
}
//止まるメソッド
public void Stop()
{
Console.WriteLine("止まる。");
}
}
//バスクラス
public class Bus : Car
{
//車内放送メソッド
public void Announce()
{
Console.WriteLine("車内放送をする。");
}
//お釣りの払い出しメソッド
public void Change()
{
Console.WriteLine("お釣りを払いだす。");
}
}
}
}
少し長いソースになっていますけど、バスクラスに対して車内放送をするメソッドや運賃に対するお釣りを支払うメソッドを追加してみました。こうすると車クラスの特徴を受け継ぎながら、バスクラス独自の性質を加えて、実世界の物の派生する姿を描き出すことができていますね。
今回の継承に関する話はここまでにしておきます。もう少し複雑なことも話すことができますが、それはオブジェクト指向を本格的に取り扱う連載でやりたいと思っています。ここでは、少なくとも「クラスは基底や派生を利用して新しいクラスを作成できる」と知っておけば十分かなと思います。
AはBの派生クラスであり、BはCの派生クラスである、という「多重継承」を記述することはできますが、あまりクラスを継承しすぎるとソースの見通しが悪くなるので、できる限り継承は1つまでにとどめておくほうが無難です。
クラスの特性を受け継ぐ継承
継承を使うことで、特定のクラスの性質を受け継いで、新しいクラスを作成できるのが「継承」のメリットです。この継承を使うことは、オブジェクト指向という概念の中でも重要な位置づけになります。
また、派生クラスではそのクラス独自の性質も加えることができます。こうしたことにより、現実世界の「オブジェクト」のあり方をプログラミングでも表現することができるのです。
継承はこれから先、多くのソースコードを見ていく中で遭遇することになると思いますので、是非とも覚えておきたいC#の基本知識といえるでしょう。自分で独自のクラスなどを考えて、是非ともアプリケーションを作成してみてください。