継承(クラスの継承)
継承にはクラス、Windowsフォーム、WEBフォームと大きく分けて3種類あります。今回はクラスの継承のお話しです。継承の中でも一番基礎的な部分となります。
VB6出身の方だと聞きなれない言葉「継承」ですが、簡単に言えば「コピーを使いまわす」といったところです。但しコピーと違う点として、以下が考えられます。
継承は・・・
一部書き換えが可能
すべてが継承されるわけではない
継承元(基底と言います)を呼び出せる
継承される元のクラスを「基底クラス」、「スーパークラス」などと言ったりします。私のブログでは「基底クラス」に統一します。
継承したクラスを「派生クラス」、「サブクラス」などと言います。こちらも私のブログでは「派生クラス」で統一です。
早速やってみよう
基底クラス(BaseClass)を以下のようにします。
public class BaseClass { public int test1 = 1; protected int test2 = 2; private int test3 = 3; public string Prop { get; private set; } = string.Empty; public void Piyo(string value) { Console.WriteLine(value); } }
Public Class BaseClass Public test1 As Integer = 1 Protected test2 As Integer = 2 Private test3 As Integer = 3 Private prop As String = String.Empty Public Property Prop1() As String Get Return prop End Get Private Set(value As String) prop = value End Set End Property Public Sub Piyo(ByVal value As String) Console.WriteLine(value) End Sub End Class
ここで注目すべきはアクセス修飾子です。別クラスからアクセスを許可する場合(public、internal)と派生クラスからアクセスを許可する場合(protected)、全てのアクセスを許可しない場合(private)と、役割に応じて隠ぺいしましょう。
sasaki816.hatenablog.com
基底クラスを継承して派生クラス(SubClass)を作ります。なお、継承は一つのクラスで一つしかできません(多重継承の禁止)。
C#の場合は派生クラス名に続いて「:」で区切って継承する基底クラスを宣言します。
public class SubClass : BaseClass { public void PiyoSub() { Console.WriteLine(test1 * 10); Console.WriteLine(test2 * 10); //Console.WriteLine(test3); ←これはコンパイルエラー Piyo("hoge"); } }
VB.NETの場合は、派生クラス名の次の行でInheritsステートメントで基底クラスを宣言します。
Public Class SubClass Inherits BaseClass Public Sub PiyoSub() Console.WriteLine(test1 * 10) Console.WriteLine(test2 * 10) 'Console.WriteLine(test3) ←これはコンパイルエラー Piyo("hoge") End Sub End Class
変数test1とtest2はアクセス修飾子がpublicとprotectedなので派生クラスからアクセス可能です。しかし、test3はprivateなので派生クラスでもアクセスすることは出来ません。
これで基底クラスと派生クラスが出来ましたので、別クラスから派生クラスを呼び出してみましょう。
SubClass sc = new SubClass(); sc.Piyo("fuga"); sc.PiyoSub(); Console.WriteLine(sc.test1); //Console.WriteLine(sc.test2); ←これはコンパイルエラー //Console.WriteLine(sc.test3); ←これはコンパイルエラー
Dim sc As New SubClass sc.Piyo("fuga") sc.PiyoSub() Console.WriteLine(sc.test1) 'Console.WriteLine(sc.test2) ←これはコンパイルエラー 'Console.WriteLine(sc.test3) ←これはコンパイルエラー
fuga 10 20 hoge 1
2行目はSubClassにないBaseClassのメソッドですが、基底クラスとして継承していますので、派生クラスのインスタンスからも呼び出せるということになります。
また、変数test2とtest3はpublicではないためアクセスすることが出来ません。