佐々木屋

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

ポリモーフィズム(継承)

継承を利用したポリモーフィズムの実現です。

デリゲートの場合はクラス内でも別クラスでも使えますが、継承は別クラスの場合に有効です。しかもデリゲートに比べると普段のクラス宣言と同じように使用出来ることや特別な記法は不要なので、特にVB.NETな方は容易に理解できると思います。


「クラス1」と表示されるShowMessageメソッドがあるクラスを考えます。このメソッドと同じような機能として、「クラス2」と「クラス3」と表示されるクラスもそれぞれ作成したとしましょう。以下の通りです。

public class Class1 {
    public void ShowMessage() {
        Console.WriteLine("クラス1");
    }
}
public class Class2 {
    public void ShowMessage() {
        Console.WriteLine("クラス2");
    }
}
public class Class3 {
    public void ShowMessage() {
        Console.WriteLine("クラス3");
    }
}
Public Class Class1 
    Public Sub ShowMessage()
        Console.WriteLine("クラス1")
    End Sub
End Class
Public Class Class2
    Public Sub ShowMessage()
        Console.WriteLine("クラス2")
    End Sub
End Class
Public Class Class3 
    Public Sub ShowMessage()
        Console.WriteLine("クラス3")
    End Sub
End Class

これらのメソッドを全て実行しようとした場合、呼び出し側では以下のようにインスタンスを別々に作成して、別々にメソッドを実行する必要があります。

Class1 test1 = new Class1();
Class2 test2 = new Class2();
Class3 test3 = new Class3();

test1.ShowMessage();
test2.ShowMessage();
test3.ShowMessage();
Dim test1 As New Class1()
Dim test2 As New Class2()
Dim test3 As New Class3()

test1.ShowMessage()
test2.ShowMessage()
test3.ShowMessage()



これらのクラスは機能・構造としては全く一緒で、違う部分は表示される内容、即ちメソッドの内容だけとなります。そうした場合Class1を基底クラスとして継承し、派生クラスをClass2、Class3とすればよいことになります。

しかし、メソッドを継承した場合、基底クラスのメソッドが実行されてしまいますので、それでは全て「クラス1」と表示されてしまいます。というワケでShowMessageメソッドをオーバーライドして新しく書き直せばいいということになります。

public class Class1 {
    public virtual void ShowMessage() {
        Console.WriteLine("クラス1");
    }
}
public class Class2 : Class1 {
    public override void ShowMessage() {
        Console.WriteLine("クラス2");
    }
}
public class Class3 :Class1  {
    public override void ShowMessage() {
        Console.WriteLine("クラス3");
    }
}
Public Class Class1 
    Public Overridable Sub ShowMessage()
        Console.WriteLine("クラス1")
    End Sub
End Class
Public Class Class2
    Inherits Class1 
    Public Overrides Sub ShowMessage()
        Console.WriteLine("クラス2")
    End Sub
End Class
Public Class Class3
    Inherits Class1 
    Public Overrides Sub ShowMessage()
        Console.WriteLine("クラス3")
    End Sub
End Class



すると呼び出し側は以下のようにスマートに書けるようになります。

List<Class1> test = new List<Class1> { new Class1(), new Class2(), new Class3() };
foreach(BaseClass t in test) {
    t.ShowMessage();
}
Dim test As New List(Of BaseClass) From {New BaseClass, New SubClass1, New SubClass2}
For Each t As BaseClass In test
    t.ShowMessage()
Next

メソッド実行がt.ShowMessage()のひとつになりました。これがポリモーフィズムの正体です。