【C#】WPFアプリケーション入門 #7 クラスとインスタンス化・クラスの継承

はじめに

前回は関数についてやりました。関数は複数の処理をまとめておき、使用するときに呼び出して使用します。引数を定義しておけば、外から値を受け取り、その値を使った処理も可能です。今回はクラスについてやります。クラスは処理をする上での設計図として扱い、使用するときにはちょっとした操作が必要です。

お品書き

  1. クラス
  2. インスタンス
  3. クラスの継承

1. クラス

クラスはよく設計図に例えられ、情報のかたまりとして扱えます。いままで MainWindow.xaml.cs に全て書き込んでいましたが、大きなプロジェクトになるとプログラムが長すぎて見るのも嫌になります。そこで、ファイルをいくつかに分けて、必要な情報をそのファイルごとに管理しましょうと考えられたのがクラスです。

例えば人間クラスを作ってみます。Visual Studio のソリューションエクスプローラーで右クリックしてクラスを追加します。

f:id:takunology:20190705224439p:plain

f:id:takunology:20190705224449p:plain

Human.cs を次のように編集します。

class Human
{
    public int 身長;
    public int 体重;
    public int 年齢;
    public string 名前;

    public int 年を取る(int x)
    {
        return x + 1;
    }
}

コーディングスタイルを無視して日本語にしてみました。C# は日本語でもOKなので、分かりやすくなると思います。
この人間クラスは身長・体重・名前という情報を持っています。public は外からデータをいじるために必要なおまじないです。(#9で説明します。)
年をとる関数は年齢の値を受け取り、+1して値を返します。このようにして人間に関するデータの設計図を作ることができます。

2. インスタンス

クラスを使うためにはインスタンス化が必要です。

Sub sub = new Sub();

インスタンス化は別のクラスを使用するために記述するコードです。インスタンス化は実体化ともいい、クラスで作成した設計図をもとにそのデータを使用できる形にします。ちなみに、インスタンスと言われたら、そのクラス内のデータすべてを指します。
クラスとインスタンスはこんな関係になります。

クラス インスタンス
想像で作った概念 (理想) 具現化した実物 (現実)

なので、クラスを作っただけでは「ただデータがあるだけ」の状態になってしまいます。使うためには「設計図を具現化する」ことが必要です。

クラス名 変数名 = new クラス名();

こうすると、インスタンス化されたクラスを "変数名" として扱うことができます。そのクラスの変数やメソッドを参照する場合はドットをつけて表記します。

3. クラスの継承

クラスはいっぱい作ることもできますが、同じようなグループに属するようなクラスは継承させることができます。つまり大きなグループに小さいグループを所属させることで、ある程度共通している部分を大きなグループで定義しておけば共通して扱えます。
例として人間クラスと学生クラス・社員クラスを作ってみます。

class 人間
{
    public int 体重;
    public int 身長;
    public string 名前;
    public int 年齢;
}
class 学生
{
    public string 学校名;
    public int 学生番号;
}
class 社員
{
    public string 会社名;
    public int 社員番号;
}

人間クラスでは身長、体重、年齢を宣言したので、これをそれぞれに継承させれば、それぞれのクラスでも人間クラスと同じインスタンスを扱えます。継承元のクラスを基底クラス といい、継承するクラスを派生クラスといいます。継承するにはこのように記述します。

class 派生クラス名 : 基底クラス名
{
    //派生クラスの処理
}

上の例では

class 学生 : 人間
{
    // 学生クラスの処理
}
class 社員 : 人間
{
    // 社員クラスの処理
}

このようになります。これをメイン側のロジックで学生と社員インスタンス化すれば、人間クラスのデータまで扱えるようになります。

class Main
{
    学生 student = new  学生();
    社員 employee = new 社員();

   // 基底クラスのインスタンス
   student.身長 = 170;
   employee.年齢 = 30;
   
   // 派生クラスのインスタンス
   student.学生番号 = 1111;
   employee.会社名 = "ほげ株式会社";
}

これが継承の良さです。プロジェクトが大きくなった場合、あらかじめ同じようなメンバ変数やメソッドを扱う場合は基底クラスに宣言しておけば使いまわしができます。

おわりに

今回はクラスとインスタンス化、継承を扱いました。今はあまりピンと来ないかもしれませんが、今後は練習でクラスを新しく作ってアプリを作っていきたいと考えております。

継承の継承はできる...?