佐々木屋

技術的なことから趣味まで色々書きます

継承(クラスの継承)

継承にはクラス、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ではないためアクセスすることが出来ません。