VBオブジェクト指向プログラミング講座 第14回 型の概念を覚えよう
VB言語で行うオブジェクト指向プログラミングは、主に型を扱います。しかしながら、型とは何かと問われた時、意外と答えられない人も多いかと思います。そこで、今回は型について解説します。型を知ることにより、プログラミング力が増すこと間違いなしです。
VBコンパイラがしていることを表現してみました。
Imports System
Imports System.Collections.Generic
'型に関する情報
Friend Structure TypeInfo
'型名。
Public Name As String
'型が持っている関数テーブル。
Private table As Dictionary(Of String, Object)
'名前を指定してインスタンスを生成する。
Public Sub New(ByVal name As String)
Me.Name = name
Me.table = New Dictionary(Of String, Object)()
End Sub
'関数もしくは手続きを登録。
Public Sub ResistFunctionOrSub(ByVal name As String, funcOrSub As Object)
Me.table.Add(name, funcOrSub)
End Sub
'関数もしくは手続きを取得。
Public Function GetFunctionOrSub(ByVal callName As String) As Object
Dim result As Object = Me.table.Item(callName)
Return result
End Function
End Structure
'サンプルで使用するオブジェクト
Friend Structure Foo
Public Value As Integer
End Structure
'エントリポインタ(プログラムの開始地点)
Module Sample
'Foo型に関する情報を取得する。
Function GetFooTypeInfo() As TypeInfo
'関数のテーブルを用意
Console.WriteLine("Foo型の準備をします。")
Dim result As TypeInfo = New TypeInfo("Foo")
Dim ctor As Func(Of Foo) = Function() New Foo()
result.ResistFunctionOrSub("New", CObj(ctor))
Console.WriteLine("コンストラクタを登録しました。")
Dim getValue As Func(Of Foo, Integer) =
Function(obj As Foo) obj.Value
result.ResistFunctionOrSub("Get_Value", getValue)
Console.WriteLine("Valueプロパティのゲッターを登録しました。")
Dim addFunc As Func(Of Foo, Integer, Foo) =
Function(obj As Foo, value As Integer)
obj.Value += value
Return obj
End Function
result.ResistFunctionOrSub("Add", addFunc)
Console.WriteLine("Addメソッドを登録しました。")
Console.WriteLine("Foo型の準備が終わりました。")
Console.WriteLine()
Return result
End Function
Sub Main()
'Foo型オブジェクトのインスタンスを生成する
Dim fooType As TypeInfo = GetFooTypeInfo()
Dim ctor As Func(Of Foo) = fooType.GetFunctionOrSub("New")
Dim obj As Foo = ctor()
'メソッドを呼び出す
Dim addValue As Integer = 10
Dim f As Object = fooType.GetFunctionOrSub("Add")
Dim addFunc = CType(f, Func(Of Foo, Integer, Foo))
obj = addFunc(obj, addValue)
Console.WriteLine("オブジェクトに{0}加算しました。", addValue)
'プロパティのゲッターを呼び出す
f = fooType.GetFunctionOrSub("Get_Value")
Dim getter = CType(f, Func(Of Foo, Integer))
Dim v As Integer = getter(obj)
Console.WriteLine("オブジェクトの値は{0}です。", v)
'間違った!
Dim name As String = "ピヨ"
Try
f = fooType.GetFunctionOrSub(name)
Catch ex As KeyNotFoundException
Console.WriteLine("Foo型に{0}関数は存在しません。", name)
End Try
'終了
Console.WriteLine()
Console.WriteLine("サンプル終了です。")
Console.ReadLine()
End Sub
End Module
サンプルがしていることは前回とほぼ同じです。違いは型を使用している点です。この点が型が目指している事です。サンプルにて、存在しない関数を呼び出そうとするとエラーになる点に注目してください。前回述べたように、オブジェクト指向プログラミングがない時代は、関数・データ・手続きがバラバラでした。バラバラに存在しても機械は困りませんが、プロジェクトの規模が大きくなると、管理をする人間は大変困ります。プログラミングの各要素がバラバラなまま、数百万行をプログラミングしている場面を想像してください。とても大変だということがわかってもらえると思います。
人間は物事を関連付けて認識します。人間はデータ・手続き・関数がグルーピングされていると、プログラムを理解しやすくなります。そこで、「型」というプログラムの要素を関連付ける方法が考えだされました。型という枠組みがあると、人間の間違いを減らし、プログラムの理解が容易になります。つまり型とは、人間がプログラムを扱いやすくするために、コードを関連付けるものだといえます。
型はオブジェクト指向プログラミングの必須知識なので、是非この機会に覚えてください。