NoWestさん、イグトランスさん、アドバイス助かります。
NoWest さんが書きました:私はC++は仮想関数では無く、純粋仮想関数を使ってインターフェイスを定義していると理解しているのですが、、、ActiveBasicも純粋仮想関数を導入してはどうですか?
双方を導入する予定です。構造的には、VC++と同等のものを用意したいのですが、構文のほうが悩ましいところです。単純に、インターフェイスでは純粋仮想関数のみを利用することがわかっていれば、
コード: 全て選択
Interface IUnknown
Function QueryInterface(riid As *GUID, ppvObj As DWordPtr) As DWord
Function AddRef() As DWord
Function Release() As DWord
End Interface
このような構文を下記のようにコンパイラが解釈すればよいということになります。
コード: 全て選択
Class IUnknown
Public
Pure Virtual Function QueryInterface(riid As *GUID, ppvObj As DWordPtr) As DWord
Pure Virtual AddRef() As DWord
Pure Virtual Release() As DWord
End Interface
"Pure"が先頭に付くことで、そのメンバ関数が純粋仮想関数であることを示し、プロトタイプ宣言という扱いになります。
"Virtual"のみの場合は、実装と共に定義される仮想関数になります。
何もつかない場合は、通常のメンバ関数になります。
NoWest さんが書きました:※もしかして、
ABの仮想関数がC++でいうところの純粋仮想関数なのでしょうか?
お察しの通り、AB4で"Virtual Function"と定義されているものはすべて純粋仮想関数です。実装は定義できません。しかも、現状ではサブクラスでのオーバーライドもできていません(現状では、通常のメンバ関数のみ、オーバーライド可能となっています)。
仮想関数のオーバーライド機能はかなり重要なものになってくることは認識しておりますので、構文案がまとまり次第、実現させようと思います。
NoWest さんが書きました:たとえば、現状ではインターフェイスIDをユーザが構造体変数として自力で
定義しないといけなくなっています。
ですのでCでいうところのexturnなんぞを導入して
GUID型の特定の名前の変数を定義したら自動的に初期化してくれるような
機能が必要ですし、
今のようにずらずらとClass~End Class間にメンバ関数を定義していく状態だとかなり大変なことになりますよね。
こいつは、VC++で言う、"#import"に相当する機能ですよね。外部インターフェイスと連携を取るプログラムを書き場合は、絶対に必要ですね。
COMで機能を提供しているDLLの内容を読み取り、インターフェイス周りの識別子情報を取得するためのプログラムを書けば、実現できそうですが、こちらはこれから資料集めです/(--)/
NoWest さんが書きました:・クラス内にスタティックメンバを入れられるとか
・フレンドクラスとか
・関数のオーバーロード
どれも重要な要素ですので、順に追加していこうと思います。関数のオーバーロード、早めに実装できるようにしますので、今しばらくお待ちください。演算子のオーバーロードもなるべく早めに…
イグトランス さんが書きました:そして、それとは別に仮想関数に対する純粋仮想関数(抽象メソッド/Abstruct, Prue, = 0など構文・用語はともかく)を将来的には用意してほしいと思っています。
(クラスの多重継承をできるようにするかどうかとは無関係に)
純粋仮想関数の用途は大きくこの2つに分類できるので用途別に構文も2つにわけた方が良い、と思っているからです。
具体的には、仮想関数、純粋仮想関数の仕分けを記述できる構文("Pure"指定)を導入すると共に、Interfaceステートメントの導入を検討しています。
Interfaceステートメントは、Classステートメントの構文仕様の関係でインターフェイス定義が冗長的にならないよう、プリプロセッサ的な働きをするものです。ようは、よりスマートにパブリックな純粋仮想関数を定義できるってことですな。
イグトランス さんが書きました:Function QueryInterface(riid As *GUID, ppvObj As DWordPtr) As DWord
riidはByRefにしませんか。Interfaceを導入するときについでにやってしまえばいいと思います。(それともByRefは使わない方針でしたっけ?)
ウーン、どっちが妥当なんでしょうか…。ポインタを隠そうとする昨今の言語事情を考慮すれば、「参照型」を積極的に活用していくことは非常に大きな意味を持つことになると思います。しかし、ABはシステム記述型の特性をもつ、C/C++の派生言語のような構造をしているんですよね。こうなると、ポインタベースの仕様が一番自然にはなってくるのですが…。
私は、C/C++のような、コアな技術者向けのスマートなコーディング作法が好きですが、それと同時に生産性を向上させるようなJava/C#的なコーディング作法にも非常に関心を持ちます。
結局のところ、こういう細かいところを今後どうしていくのかは、まだ考え中といった段階です。裏づけになるいい資料、「こういうところを勉強しなよ~」といったところがありましたら、引き続き、アドバイスをいただけると助かります。