前回は簡単なクラスをつくってみますた。ファイルを読み込むだけのABFILEクラスです。
でもおこんなものなーんの役にもたちゃしねえわけです。

さて今回お話するのはコンストラクタとデストラクタです。
コンストラクタを笑うものはデストラクタに泣くという格言があるくらい重要なパートです。
こいつを理解するとオブジェクト指向なんて小難しいことは知らなくて構いません。
そもそもABでオブジェクト指向しようなんてのが土台無理な話なのです。
ABは大規模いや中規模開発すら大変なクソ言語です。
正直ファイルの分割なんてあって無いようなものだしスコープに対する静的オブジェクトも作れないし。
他の言語でつくられたモジュールとの連携も多大な制約を受け、
もしオブジェクト指向を勉強したいなら他の言語でやってくれ。と声を大にして言いたい。
ABなんぞホビーで使う言語であり、それに特化しているのだから。

コンストラクタ(構築子、コントラ)はオブジェクトのインスタンスが生成されたときに呼ばれる関数です。
デストラクタ(消滅子、消去子、デコトラ)は、オブジェクトが破棄されるときに呼ばれる関数です。
ここで?マークだらけになった人は見込みがあります。
もしすんなり理解できた人はABプログラマとしての素質はありません。すぐJAVAに移行してください。

クラスはあくまで型です。オブジェクトはその型の物(対象)です。インスタンスと言うのは実体です。
Dim f As ABFILE'オブジェクトfはABFILEという型ですよ。また実体を持っていますよ
Dim p As *ABFILE'オブジェクトpはABFILEという型を指しますよ。でも実体は用意されていません。
p = New ABFILE'pはABFILE型の実体を指しますよ。

DLLを作ったことのある人はDllMainという関数を知っているでしょう。
そのなかにDLL_PROCESS_ATTACHという条件があります。まさにこれこそがコンストラクタです。
デストラクタはその逆でDLL_PROCESS_DETACHされたときのことです。


Class ABFILE
Private
hF As HANDLE
Public

'コンストラクタ!
Sub ABFILE()
'何もしない、することがない
End Sub

'デストラクタ
Sub ~ABFILE()
mClose()'閉じ忘れ対策
End Sub

Function mOpen(filename As String) As Long
If hF Then mClose()
hF = CreateFile(StrPtr(filename), GENERIC_READ, 0, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hF = INVALID_HANDLE_VALUE Then
hF = NULL
End If
mOpen = hF
End Function

Function mRead(buffer As VoidPtr, length As DWord) As DWord
If hF = NULL Then Exit Function
ReadFile(hF, buffer, length, VarPtr(mRead), ByVal 0)
SetByte(buffer As *Byte + mRead, 0)
End Function

Function mClose() As Long
If hF Then CloseHandle(hF)
hF = NULL
Print "ファイル閉じたよ"
End Function


End Class


#N88BASIC
Dim f As ABFILE
Dim buf[555] As Byte

f.mOpen("555.abp")
While f.mRead(buf, 555)
Print MakeStr(buf);
Wend


前回のプログにコンストラクタとデストラクタを書いてみました。
コンストラクタは何もしません。もし書かなくてもこのように何もしないコンストラクタは暗黙的に定義されます。
デストラクタも何もしないものが暗黙的に宣言されます。
またコンストラクタやデストラクタは返り血が無いのでエラーに成っても適切に処理できるように工夫しなければいけません。