VBオブジェクト指向プログラミング講座 第13回 オブジェクト指向プログラミングの原理を覚えよう
前回デリゲートオブジェクトが、特別な数値を使って、手続きと関数を適切に呼び出していると書きました。この部分について興味を持った人もいるかと思います。実はこの事と、オブジェクト指向プログラミングの原理と深い関係があります。そこで今回は、オブジェクト指向プログラミングの原理を解説します。
Imports System.Collections.Generic
Structure Foo
Public Value As Integer
End Structure
Module Sample
Sub Main()
'関数のテーブルを用意
Dim table As List(Of Object) = New List(Of Object)()
Console.WriteLine("コンストラクタを登録しました。")
table.Add(CObj(New Func(Of Foo)(AddressOf Constructor)))
Console.WriteLine("Valueプロパティのゲッターを登録しました。")
table.Add(CObj(New Func(Of Foo, Integer, Foo)(AddressOf Add)))
Console.WriteLine("Addメソッドを登録しました。")
table.Add(CObj(New Func(Of Foo, Integer)(AddressOf Get_Value)))
Console.WriteLine()
'コンストラクタを呼び出す
Dim index As System.IntPtr
Console.WriteLine("Fooオブジェクトのインスタンスを生成します。")
Dim ctor = CType(table(index), Func(Of Foo))
Dim obj As Foo = ctor()
'メソッドを呼び出す
index = 1
Dim addValue As Integer = 10
Dim addFunc = CType(table(index), Func(Of Foo, Integer, Foo))
obj = addFunc(obj, addValue)
Console.WriteLine("オブジェクトに{0}加算しました。", addValue)
'プロパティのゲッターを呼び出す
index = 2
Dim getter = CType(table(index), Func(Of Foo, Integer))
Dim v As Integer = getter(obj)
Console.WriteLine("オブジェクトの値は{0}です。", v)
Console.ReadLine()
End Sub
'コンストラクタ
Function Constructor() As Foo
Return New Foo()
End Function
'メソッド
Function Add(ByVal obj As Foo, ByVal value As Integer) As Foo
obj.Value += value
Return obj
End Function
'プロパティ
Function Get_Value(ByVal obj As Foo) As Integer
Return obj.Value
End Function
End Module
ちょっと難しいサンプルですが、ステップ実行すればよくわかると思います。難しく見えますが、やっていることは単純です。Fooオブジェクトのインスタンスを作り、Addメソッドを呼び出し、最後にプロパティから値を取得しているだけです。サンプルに書いてある関数のテーブルこそ、オブジェクト指向プログラミングの実現を可能としているものです。オブジェクト指向プログラミングでは、データと手続きと関数でできていますが、それを実現しているのがこの考え方なのです。
アセンブラレベルで考えると、全ては0と1しかありません。ですから最終的には、関数や手続きの呼び出しは名前ではなく、アドレス(数値)を指定しています。従って原理的には、関数と手続きがどこにあるのかを示すアドレスさえわかっていれば、それを実行することができます。この考えを応用すれば、予めアドレスを管理しておき、人間が指定した関数を呼び出せるようにすれば、より分かりやすいプログラムとなります。それが、オブジェクト指向プログラミング言語の原理です。
オブジェクト指向プログラミングがない時代には、データと手続きと関数がバラバラでした。そこで、データと手続きと関数をまとめて、より人間がわかりやすい形式にするという発想が出ました。その結果生まれたのが、オブジェクト指向プログラミングなのです。このことがわかれば、デリゲートが何故特別な数値を使うのかわかると思います。もちろんデリゲートとオブジェクト指向プログラミングの原義は全く同じではありませんが、考え方そのものはほとんど同じです。
オブジェクト指向プログラミングの原理がわかれば、プログラミングの能力が飛躍的にアップします。この機会にぜひ覚えてください。