佐々木屋

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

オーバーライド

よく間違えるNo1のオーバーライドです。「オーバーロード」とよく間違えて使う人がいますが、この二つ全く意味が違いますので混同しないように注意しましょう。オーバーライドはオブジェクト指向の「継承」分野で必要な機能となります。

オーバーライドを簡単に説明すると、「振る舞いを上から(over)塗りつぶす(ride)」というニュアンスで、基底の振る舞いを継承先で変更する場合に使用します。メソッド、プロパティ、インデクサーに使用でき、変数やstaticメンバー、抽象メソッド(abstract)には使用することは出来ません。
今回はメソッドを例としてオーバーライドを説明します。


オーバーライドされる側のメソッドにC#の場合「virtual」、VB.NETの場合「Overridable」キーワードを指定します。このキーワードを指定しないメソッドはオーバーライドすることが出来ません。

public class BaseClass {
    public virtual void ShowMessage() {
        Console.WriteLine("基底クラス");
    }
}
Public Class BaseClass
    Public Overridable Sub ShowMessage()
        Console.WriteLine("基底クラス")
    End Sub
End Class

つまり、派生クラスで勝手に書き換えを禁止する為の措置となります。これらのメソッドを「仮想メソッド」と呼びます。


オーバーライドする側のメソッドはC#の場合「override」、VB.NETの場合「Overrides」キーワードを指定します。このキーワードを指定すると、メソッドを自由に変更することが出来るようになります。

public class SubClass : BaseClass {
    public override void ShowMessage() {
        Console.WriteLine("派生クラス");
    }
}
Public Class SubClass
    Inherits BaseClass
    Public Overrides Sub ShowMessage()
        Console.WriteLine("派生クラス")
    End Sub
End Class



実行は以下のように、派生クラスについては継承元の型でも宣言可能(ポリモーフィズム)です。

BaseClass test1 = new BaseClass();
SubClass1 test2 = new SubClass();
BaseClass test3 = new SubClass();

test1.ShowMessage();
test2.ShowMessage();
test3.ShowMessage();
Dim test1 As New BaseClass()
Dim test2 As New SubClass()
Dim test3 As BaseClass= New SubClass()

test1.ShowMessage()
test2.ShowMessage()
test3.ShowMessage()
基底クラス
派生クラス
派生クラス



よって、以下のようにジェネリックコレクションを利用した宣言も可能となります。

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