satakesatakeの日記

 | 

2009-09-14

VBAはインターフェースのみ継承可能

| 16:38

VBAには、implementsというキーワードがある。継承を行うことを指示するキーワードだ。これを使うことで、インターフェース継承が行える。実際に使うと、派生クラス側のインターフェースに問題があれば、コンパイルエラーを出して知らせてくれる、というニュアンスのほうがわかりやすいかも。

以下、簡単な使い方。

ITest.bas: ※インターフェース

Option Compare Database
Option Explicit

Property Get alpha() As String
End Property

Property Let alpha(str As String)
End Property

Public Sub one()
End Sub

classTest.bas: ※実装側

Option Compare Database
Option Explicit

Implements ITest

Private class_test_alpha As String

Property Get ITest_alpha() As String
    ITest_alpha = class_test_alpha
End Property

Property Let ITest_alpha(str As String)
    class_test_alpha = str
End Property

Public Sub ITest_one()
    Debug.Print "ITest_one"
End Sub

Public Sub one()
    Debug.Print "one"
End Sub

formMain:

Private Sub buttonRun_Click()
    Dim c As ITest
      
    Set c = New classTest
    c.one
    c.alpha = "test"
    Debug.Print c.alpha
End Sub

ここで、わかりにくい点を列挙。

  • 派生クラス側の継承したメソッドやプロパティには、プリフィックスとして、親クラスの名前を付ける。
    • 親クラスITestのメソッドが「one」だとしたら、派生クラスの同メソッドは、「ITest_one」となる。
    • ゆえに、親クラスのインターフェース名称には「_」が使えない。*1
      • プライベートメンバであれば問題はなさそうだ。
  • 派生クラスをインスタンス化して使用するには、DimのAs以降に、親クラスのオブジェクト名で宣言する。

メリットとしては、Implementsを使用することで、親クラスが明確化されるため、何か他のクラスのプロパティでITestを取るものがあった場合、派生クラスのclassTestでも問題なく代入できると言う点だ。

メソッドの継承はできないが、この点では立派なポリモーフィズム

*1:使えるんだが、継承したメソッド名としてコンパイラが認識しなくなる

 |