この場合、IA の非拡張属性は許可されますか?
はい、そうです。
[nonextensible]
typelib type flag に変換されたインターフェイスの属性には、 TYPEFLAG_FNONEXTENSIBLE
Visual Basic (6 またはアプリケーションの場合) に、基礎となるIDispatch
.
Dim A As IA
Set A = Obj ' QueryInterface
A.MethodA
' Compilation error
' A.MethodB
' If A.Property Then A.MethodC
Dim B As IB
Set B = Obj ' QueryInterface
B.MethodA
B.MethodB
' Compilation error
' If B.Property Then B.MethodC
がない[nonextensible]
と、Visual Basic は不足しているメソッド呼び出しとプロパティ アクセスをコンパイルしIDispatch::GetIDsOfNames
ますIDispatch::Invoke
。
一般に、これは、コンパイル時のチェックを優先し、動的ルックアップが必要な場合、Object
または必要な場合に変数を宣言するようにコードに強制する場合に適しています。Variant
expando オブジェクトでは面倒かもしれませんが、いずれにしてもIDispatch
の契約の1 点に違反します。
IDispatch::GetIDsOfNames メソッド
…<br />
解説
…<br /> メンバとパラメータの DISPID は、オブジェクトの存続期間中一定のままである必要があります。これにより、クライアントは一度 DISPID を取得し、後で使用できるようにキャッシュできます。
…<br />
注意 このメソッドを使用して、JavaScript によって追加された値など、動的に追加された値にアクセスすることはできません。代わりに、IDispatchEx インターフェイスの GetDispID を使用してください。詳細については、IDispatchEx インターフェイスを参照してください。
…<br />
Alt編集: Word VBA ( + ) で試すことができるサンプルを次に示しますF11。マクロを追加して、このテキストを貼り付けます。
Dim Docs As Documents
Set Docs = Application.Documents
Docs.Add
' Compilation error
' Docs.Foo
Dim Doc As Document
Set Doc = Docs(0)
Doc.Activate
Doc.Foo
試してみるには、メニューの [デバッグ] → [プロジェクトをコンパイル] を選択します。
正常にコンパイルされるはずです。(デフォルトの) インターフェース (for)にはメソッドDocument
がありませんが、そうではないため(二重否定に注意してください)、呼び出しはランタイム ディスパッチになります。Foo
[nonextensible]
ここで、プロジェクトのコメントDocs.Foo
を外して再コンパイルします。
(デフォルト) インターフェース (for)Documents
が[nonextensible]
あり、不足しているメソッドへの呼び出しがFoo
ランタイム ディスパッチに変換されないため、エラーがスローされるはずです。