ODBらしくなってきました。
前回作ったTestClassをベースにします。
派生クラスをTestClassInhelitという名前で作成します。Extendsを選び、User.Main.TestClassを設定します。
派生クラスを次のように記述します。
★☆重要
StudioのTestClassの基底クラスに、次のコードを追加します。これは、VBで操作する際、Cache'に取り込んだクラスの規定動作が、(operator =)に対して「データベースアドレスを代入する」という動きになり、よく使われる(代入する)の動きになりません。それを実現するのがこのGetClone関数です。
Method GetClone(deep As %String = 1) As User.Main.TestClass [ Language = cache ]
{
//OK
Quit ..%ConstructClone(deep)
}
VB.NETに設定したObjectBindingの機能で、TestClassとTestClassInhelitを>で取り出し、Generateボタンで生成して、VB.NETの「追加→既存の項目」でObjectBinding2.vbを追加します。
VB.NET側で、Button3を作り、次のように記述します。GetCloneを使う個所に注目してください。なお、オブジェクト指向プログラミングにおける派生クラスのキャストと同様に、基底クラスで生成された変数は(派生クラス型のデータ)をすべて持つことになります。
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
'派生クラスを呼ぶ方法
Dim cacheConnectStr As String = "Server = localhost; Port=1972;" +
"Log File = C:\VSProject\NewCarte\NewCarte\NewCarte\bin\NewCarte.log; Namespace = USER;" +
"Password = yourpass; USER ID = yourid"
Dim cnCache As CacheConnection = New CacheConnection(cacheConnectStr)
cnCache.Open()
Dim d2 As User.Main.TestClassInhelit
d2 = New User.Main.TestClassInhelit(cnCache)
d2.name = "Nakagawa Saburou"
d2.age = 34
d2.name2 = "Sanchan"
d2.age2 = 35
d2.Save()
d2.Close()
'そもそも、Cache'クラスにおける(operator =)は、「同じデータベースの箇所」を参照することになるので、以下のように記述する
Dim d11 As New User.Main.TestClass(cnCache)
d11 = d2.GetClone("1") '★注意:d11=d2とすると、単にd2と同じレコードを参照してしまう!
'★注意:d22 = TryCast(d1, User.Main.TestClass) 、 d22 = d1.GetClone("1")はいずれもエラーになる!
'd11はTestClassInhelitのデータをすべて持つ
d11.Save()
d11.Close()
End Sub
実行結果(ID=20が、基本クラスでインスタンスを生成し、派生クラスのキャストをして保存した結果。基本、Cache'はMUMPSの柔軟性を生かし、データが消える側にデータ操作をしない傾向にある。)