極論するとこれ、オブジェクト指向というよりも、、、単に継承&カプセル化が利用できるようになった、便利なデータ型なのではないかと。 (言葉悪くて、スイマセン...)
まず最初に困ったのは、メソッド(クラス Function) に オーバーロード が無いことです。 簡単に言えば、引数の異なる同じ名前のメソッドを定義できる、というものです。
例えば、以前にご紹介した CoreLog クラス ですが、オブジェクトを初期化する New 部分は、以下のような感じで複数用意したかったのです。 でもこれを実装しようとすると2個目以降の New の定義が「以前に宣言した名前です。」 と怒られちゃいますよね。
Public Class CoreLog
Sub New()
Call New(Nothing, 2, "default log")
End Sub
Sub New(logType$)
Call New(Nothing, 2, logType$)
End Sub
Sub New(doc As NotesDocument, level%, logType$)
....
End Sub
End Class
多態性を利用すると、例えば、作成したコードを気軽に利用できるようになります。 引数によく使うデフォルト値がある場合、僕はよく、引数の有る/無しで複数のメソッドを定義します。
引数を指定する必要が無いときは、単に最低限の引数で呼び出すと、お任せで動作する。 それが僕の好みです。 細かく制御したくなったら、はじめてマニュアル等を調べて、引数を追加してもらえば良いわけです。 オートマでもマニュアルでも運転できる車、と言ったら大げさですが、そんなイメージかなぁ。
逃げ道としては、古典的ですが、引数の違いを名前に反映させることでしょうか。 例えば数値を追加する場合には "addNumber(value%)" を使用し、文字列を追加する場合には "addString(value$)" を利用する、といった実装です。 LotusScript で用意されているクラスにはこのパターンが多い気がします。
この場合、New などの名前が変えられないものは、デフォルト処理のみを実行するしかないですね。 後で setXXXX などのセッターや、setupXXXX などのメソッドで、必要な値をセットするカタチになります。
まったく別の手法として、引数に Variant 型を指定する方法もあるとは思います。 が、僕は Variant にはどうも馴染めず... って、これは次回のネタにしましょう。(^-^;
いかんせん元からNotesな人は「基本は@関数だぜっ!!」ですからオブジェクト指向の世界がわかる人あまりいないと思います。
私もUML(Unified Modeling Language)の方向からオブジェクト指向に興味を持ってちょっと勉強はしたのですが、挫折しました。
私同様に元からNotesな人で「ポリモーフィズム??全然わからない〜〜」って人は下記の「社長命令・起立!!」という例題の話読んだらちょっとだけイメージがわかるかなと思います。
オブジェクト脳のつくり方
www.objectclub.jp/event/2003christmas/pdf/object_brain.pdf
オブジェクト指向開発の三大要素ですね.
ちょうどいま,オブジェクト指向基礎の講習会を実施しているので,この記事について気になるところがあったので書かせていただきます.
「引数の異なる同じ名前のメソッドを定義できる」というのは,ポリモフィズムではなく,オーバーロードですね.
ポリモフィズムは,メソッドを呼び出す側のオブジェクトが,相手のオブジェクトの種類を特定せずにメッセージ送信(依頼)することです.
呼び出し側で,相手のオブジェクトを特定する条件判定が不要になるので,オブジェクトの種類が増えた場合でも,呼び出し側のロジックを変更しなくても済むというメリットがありますね.
いずれにしろ,LotusScriptは完全なオブジェクト指向ではないので,Javaから入った人は違和感がありますね〜
いや僕もNotes開発では「基本は@関数だぜっ!!」と考えてオリマス。新人クンには@関数バリバリの課題ばかり出してたりしますし。
僕の周りには LotusScript のクラスを作成する人があまりに居ないので、珍しいかなとネタにしているところがありまして。(^-^;
茶坊主 さん、こんばんは。
そ、そうです。オーバーロードが正解です...(冷や汗
ご指摘ありがとうございます! 助かりました。 恥ずかしいのでコッソリ本文を修正してしまいますね。 (^-^;
(Optionalがないので、引数の数は変えられない)
Class SampleClass
Public Sub PseudoOverload(varTgt as Variant)
Select Case TypeName(varTgt)
Case "STRING"
'//文字列に対する処理
Case "STRING( )"
'//文字列配列に対する処理
Case "INTEGER"
'//整数に対する処理
Case Else
Error 1900 "引数の型が不正です"
End Select
End Sub
End Class