However, I discovered that the code had a memory leak caused by a circulare reference.
You can find a solution here.
The Keyword Implements in VBA/VB6 allows you to do Interface Implementation, which in turns allows for Polymorphism. This is indeed a great capability of the VB6 language that is often overlooked.
While the VB6 version of interface implementation is not so elegant as the one from .NET environment, it still allows you to implement most of the pattern of the GoF books
I will show you a very easy example on how to use it in VBA.
The Idea is to create an interface called IInstrumet with just one property "Id", and have a Security class that implements its interface. You could also have a Fund, Porftolio or a Security Class that implements this interface. This wil allow for polymorphism.
Dim inst as IInstrument
Dim sec as Security
Dim fn as Fund
Set sec = new Security
Set fn = new Fund
Set inst = sec
Set inst = fn
As you can see, bot a security and a fund can be assigned to an Instruments object!
We first define a Class called IInstrument. The code is here
'This is an Interface for the Generic Financial Instrument Public Property Get Id() As String 'Only Signature End Property Public Property Let Id(value As String) 'Only Signature End Property
We now create a new Class called Security that Implements the IInstrument one. This is a bit more tricky.
Once we implement an Interface, the Class that implements it in VB6 will declare those method as Private like that.
Private Property Get IInstrument_Id() As String
IInstrument_Id = mId
End Property
This is a kind of unsual behaviour, because if I know that the Security class implements the IInstrument interface, I expect to have access to the same methods and property made available by the interface obejcts. For this reason, I usually expose as public member the same properties and functions that are available in the interface. When I implement them, I delegate the job to the interface method
3) I implement the interface methods as I normally do. a declare a module level variable mId
Private Property Get IInstrument_Id() As String
IInstrument_Id = mId
End Property
Private Property Let IInstrument_Id(value As String)
mId =value
End Property
4) I crate public properties / methods mirroring the interface delegating their implementation to the
mInstrument object
Public Property Get Id() As String
Id =IInstrument_Id
End Property
Public Property Let Id(value As String)
IInstrument_Id = value
End Property
Here you can find the Security Class Code
Implements IInstrument Private mId As String Public Ticker as String Private Sub Class_Initialize() End Sub Private Property Get IInstrument_Id() As String IInstrument_Id = mId End Property Private Property Let IInstrument_Id(value As String) mId = value End Property 'Public Interface Public Property Get Id() As String Id = IInstrument_Id End Property Public Property Let Id(value As String) IInstrument_Id = value End PropertyWe can now test the code
Sub TestSecurity() Dim Sec1 As Security Dim Inst As IInstrument Dim Sec2 As Security Set Sec1 = New Security Sec1.Id = 10 Sec1.Ticker = "MXEU" Set Inst = Sec1 'Upcast: A Security in an Instruments Debug.Print Inst.Id 'DownCast, this should have been done explicit, but VBA does not support CType. 'VB6 does. So instead of CType(Inst, "Security") we can do If TypeName(Inst) = "Security" Then Set Sec2 = Inst End If Set Sec2 = Inst Debug.Print Sec2.Id Debug.Print Sec2.Ticker End Sub
Useful article. Thanks.
ReplyDeleteVery helpful! Thanks a million.
ReplyDelete