【C#】「クラスの継承」

C#のクラスの継承とは、クラスに設定した情報を別のクラスで引き継いでクラスを作成することです。
引き継ぐ元のクラスを「基本クラス」とよび、引き継いだ後のクラスを「派生クラス」と呼びます。

クラスの継承の構文

class 基本クラス
{
処理
}
class 派生クラス : 基本クラス名
{
処理
}

クラスの継承の例文

using System;
namespace TestProgram
{
 class Program1
 {
  public int a = 1;
public void Pro1Method() { Console.WriteLine("基本クラスです。"); } }
class Program2 : Program1 { public int b = 2;
public void Pro2Method() { Console.WriteLine("派生クラスです。"); } }
class MainClass { static void Main() { //Program1と2のクラスをオブジェクト化 Program1 pro1Obj = new Program1(); Program2 pro2Obj = new Program2();
//Program1と2のメソッドを呼び出し pro1Obj.Pro1Method(); pro2Obj.Pro2Method();
//基本クラスのaの値を呼び出し Console.WriteLine("{0}", pro1Obj.a);
//派生クラスのaとbの値を呼び出し Console.WriteLine("{0}", pro2Obj.a); Console.WriteLine("{0}", pro2Obj.b);
//キーを押すまでコマンドプロントを終了させない Console.ReadLine(); } } }

まず、「Class Program2 : Program1」でProgram1クラスをProgram2クラスに継承させます。
Mainメソッドの「Program1 pro1Obj = new Program1();」でProgram1をオブジェクト化します。
Mainメソッドの「Program2 pro2Obj = new Program2();」でProgram2をオブジェクト化します。
Mainメソッドの「pro1Obj.Pro1Method();」でProgram1のメソッドを呼び出しているので、コマンドプロントに「基本クラスです。」と表示されます。
Mainメソッドの「pro1Obj.Pro2Method();」でProgram2のメソッドを呼び出しているので、コマンドプロントに「派生クラスです。」と表示されます。
Mainメソッドの「Console.WriteLine(“{0}”, pro1Obj.a);」で基本クラスのaの値を呼び出しているので、コマンドプロントに「1」と表示されます。
Mainメソッドの「Console.WriteLine(“{0}”, pro2Obj.a);」で派生クラスのaの値を呼び出しているので、コマンドプロントに「1」と表示されます。
Mainメソッドの「Console.WriteLine(“{0}”, pro2Obj.b);」で派生クラスのbの値を呼び出しているので、コマンドプロントに「1」と表示されます。
派生クラスにaの変数は書いていませんが、派生クラスは基本クラスの要素を全て継承しているので、aの値には1が入っています。
例を実行するとコマンドプロントに「基本クラスです。」「派生クラスです。」「1」「1」「2」と表示されます。

派生クラスは基本クラスのすべての情報を引き継ぐ

派生クラスは基本クラスの情報を全て引き継ぎます。
派生クラスを作ったからといって基本クラスはなくなりません。
基本クラスのインスタンスを作成することもできます。

派生クラスでアクセスできるデータ

アクセス修飾子は「pubic」「private」「protected」の3種類があります。
「pubic」は全てのクラスからアクセスができます。
派生クラスからもアクセスできますし、他のクラスからもアクセスできす。
「private」は自分自身のクラスからしかアクセスできません。
派生クラスからもアクセスできません。
「protected」は自分自身のクラスと、派生クラスからのみアクセスできます。
基本クラスでは全て「pubic」をつければ何も考えなくても派生クラスからもアクセスできるのでよさそうに見えますが、全てのクラスからアクセスできてしまうので、いつの間にか値が変わってしまいエラーが起きることがあるので、データ保護の視点からはあまりよろしくないです。
後々、不具合が起きないように基本クラスには「protected」をつけて基本クラスと派生クラスからしかアクセスできないようにしておくことをおすすめします。
派生クラスで基本クラスにアクセスできるデータは、アクセス修飾子に「public」か「protected」がついたものです。
「private」をつけたものはアクセスできせん。

「継承クラスの隠蔽」派生クラスで基本クラスと同じ名前のメンバーを使う

派生クラスでは、基本クラスと同じ名前のメンバーが使えます。
このことを継承クラスの隠蔽と呼びます。
同じ名前を使うには、派生クラスのメンバーの前に「new」キーワードをつけます。
そうすると、呼び出したときに派生クラスのメンバーが呼び出されます。

「継承クラスの隠蔽」派生クラスで基本クラスと同じ名前のメンバーを使うの構文

class 基本クラス
{
型 変数名 = 値;
}
class 派生クラス : 基本クラス名
{
new 型 変数名(基本クラスと同名) = 値;
}

「継承クラスの隠蔽」派生クラスで基本クラスと同じ名前のメンバーを使う例

using System;
namespace TestProgram
{
 class Program1
 {
  public int a = 1;
  public void Pro1Method()
  {
   Console.WriteLine("基本クラスです。");
  }
 }
class Program2 : Program1 { //基本クラスと同名のメンバーを指定 new public int a = 2;
//基本クラスと同名のメソッドを指定 new public void Pro1Method() { Console.WriteLine("派生クラスです。"); } }
class MainClass { static void Main() { //Program1と2のクラスをオブジェクト化 Program1 pro1Obj = new Program1(); Program2 pro2Obj = new Program2();
//Program1と2のメソッドを呼び出し pro1Obj.Pro1Method(); pro2Obj.Pro1Method();
//基本クラスのaの値を呼び出し Console.WriteLine("{0}", pro1Obj.a);
//派生クラスのaの値を呼び出し Console.WriteLine("{0}", pro2Obj.a);
//キーを押すまでコマンドプロントを終了させない Console.ReadLine(); } } }

例を実行するとコマンドプロントに「基本クラスです。」「派生クラスです。」「1」「2」と表示されます。
基本クラスの変数に「a」と変数名をつけ、1を代入します。
基本クラスのメソッドに「Pro1Method()」とメソッド名をつけます。
派生クラスの変数の先頭に「new」をつけ、基本クラスの変数と同名の「a」とつけ、2を代入します。
派生クラスのメソッドの先頭に「new」をつけ、基本クラスのメソッドと同名の「Pro1Method()」とつけます。
MainクラスでProgram1と2のクラスをオブジェクト化します。
「pro1Obj.Pro1Method();」で基本クラスのメソッドを呼び出し、実行するとコマンドプロントで「基本クラスです。」と表示されます。
「pro2Obj.Pro1Method();」で派生クラスのメソッドを呼び出し、実行するとコマンドプロントで「派生クラスです。」と表示されます。
基本クラスと派生クラスで同名のメソッド名「Pro1Method()」とつけていますが、基本クラスと派生クラスの値の両方にアクセスできています。
「Console.WriteLine(“{0}”, pro1Obj.a);」で基本クラスのaの値の呼び出し、実行するとコマンドプロントで「1」と表示されます。
「Console.WriteLine(“{0}”, pro2Obj.a);」で基本クラスのaの値の呼び出し、実行するとコマンドプロントで「2」と表示されます。
こちらも同様に、基本クラスと派生クラスで同名の変数名「a」とつけていますが、基本クラスと派生クラスの値の両方にアクセスできています。

派生クラスをオブジェクト化して継承した基本クラスのメンバーにアクセスする

先程は、基本クラスと派生クラスでnewをつけた同じメンバー名を使って、基本クラスと派生クラスそれぞれのクラスをオブジェクト化してアクセスしていました。
今度は派生クラスだけオブジェクト化して、継承した同じメンバー名の派生クラスと基本クラスの値を取得したいと思います。
派生クラスで「new」使い、基本クラスと同じ名前のメンバーを作った場合、基本クラスのメンバーは上書きされた訳ではなく通常のアクセス方法ではアクセスできなくなっているだけです。
ですので、派生クラスで継承した基本クラスへ参照して値を取得することも可能です。
アクセスするには基本クラスのメンバー名の前に「base」をつけます。

派生クラスをオブジェクト化して継承した基本クラスのメンバーにアクセスする構文

base.メンバー名

派生クラスをオブジェクト化して継承した基本クラスのメンバーにアクセスする例

using System;
namespace TestProgram
{
 //基本クラス
 class Program1
 {
  public int a = 1;
  public void Pro1Method()
  {
   Console.WriteLine("基本クラスです。");
  }
 }
//派生クラス class Program2 : Program1 { //基本クラスと同名のメンバーを指定 new public int a = 2;
public void Pro2Method() { Console.WriteLine("派生クラスです。"); Console.WriteLine("継承した基本クラスの変数aの値は{0}, 派生クラスの変数aの値は{1}", base.a, a); } }
class MainClass { static void Main() { //Program2の派生クラスをオブジェクト化 Program2 pro2Obj = new Program2();
//Program2のメソッドを呼び出し pro2Obj.Pro2Method();
//キーを押すまでコマンドプロントを終了させない Console.ReadLine(); } } }

例を実行すると、「派生クラスです。」「継承した基本クラスの変数aの値は1, 派生クラスの変数aの値は2」と表示されます。
基本クラスで「変数a」に1を代入します。
派生クラスでnewをつけ変数aに2を代入します。
派生クラスの「Console.WriteLine(“継承した基本クラスの変数aの値は{0}, 派生クラスの変数aの値は{1}”, base.a, a);」で「base.a」の部分で基本クラスを参照してaの値を取得します。
Mainクラスの「Program2 pro2Obj = new Program2();」で派生クラスのオブジェクトを作成します。
Mainクラスの「 pro2Obj.Pro2Method();」で派生クラスのメソッドを呼び出します。
実行すると「継承した基本クラスの変数aの値は1, 派生クラスの変数aの値は2」と表示されます。
「base.a」で基本クラスのaの値が取得され、aで派生クラスのaの値が取得されています。

複数の派生クラスをつくる

基本クラスから派生クラス1をつくれるように、派生クラス1から更に派生クラス2をつくるなど、複数の派生クラスをつくることができます。
その場合は、基本クラスの情報も派生クラス1の情報も派生クラス2に継承されます。