タイプセーフな COM 列挙を実装するにはどうすればよいですか?
質問
Delphi の COM シナリオでタイプセーフ列挙を実装するにはどうすればよいですか?基本的に、列挙型のプリミティブ定数のセットを、クラスにカプセル化された静的な最終オブジェクト参照のセットに置き換えたいと考えています。。Java では、次のようなことができます。
public final class Enum
{
public static final Enum ENUMITEM1 = new Enum ();
public static final Enum ENUMITEM2 = new Enum ();
//...
private Enum () {}
}
カスタマイズされた列挙型を使用して比較を行います。
if (anObject != Enum.ENUMITEM1) ...
現在古い Delphi 5 を使用していますが、インターフェイスでいくつかの enums パラメータを宣言し、クライアント オブジェクトが必要な列挙型の代わりに整数 (またはlong) 型を渡すことを許可しないようにしたいと考えています。ネイティブの Delphi 列挙型を使用する以外に列挙型を実装するより良い方法はありますか?
解決
COM について言及するなど、質問の性質についてさらに手がかりを提供していただきました。あなたの言いたいことは理解できたと思います。COM は、Delphi が COM サーバーとクライアントの間で認識している型のサブセットのみをマーシャリングできます。TLB エディターで列挙型を定義できますが、これらはすべて TOleEnum 型であり、基本的には整数型 (LongWord) です。TOleEnum 型の変数に任意の整数値を設定し、異なる enum 型の値を相互に割り当てることができます。実際にはタイプセーフではありません。
Delphi の COM がタイプ セーフな列挙型を代わりに使用できない理由は思いつきませんが、そうではありません。残念ながらそれに関しては何もできることがありません。おそらく、次期 Delphi 2009 バージョンの TLB エディタの変更により、この状況が変わる可能性があります。
記録のために:TLB エディタが使用されていない場合、Delphi はタイプ セーフな列挙型をパラメータとして持つメソッドとのインターフェイスを完全に持つことができます。
他のヒント
ネイティブの Delphi 列挙型はすでにタイプセーフです。以前は列挙型がまったくなかったため、Java 列挙型はその言語にとって革新的なものでした。ただし、おそらく別の機能、つまり型名が接頭辞として付けられた列挙値のことを意味しているのかもしれません。
今後の Delphi 2009 と Delphi for .NET 製品の最終バージョンでは、スコープ列挙型と呼ばれる新しいディレクティブがサポートされます。次のようになります。
{$APPTYPE CONSOLE}
{$SCOPEDENUMS ON}
type
TFoo = (One, Two, Three);
{$SCOPEDENUMS OFF}
var
x: TFoo;
begin
x := TFoo.One;
if not (x in [TFoo.Two, TFoo.Three]) then
Writeln('OK');
end.
ネイティブの Delphi 列挙型の何が問題なのでしょうか?これらはタイプセーフです。
type
TMyEnum = (Item1, Item2, Item3);
if MyEnum <> Item1 then...
Delphi 2005 以降、クラス内に const を含めることができますが、Delphi 5 ではできません。
type
TMyEnum = sealed class
public
const Item1 = 0;
const Item2 = 1;
const Item3 = 2;
end;
Borland が TLB エディターでタイプ セーフな列挙型を使用しない理由が分かった気がします。COM の列挙型は異なる値にすることができますが、Delphi 6 以降ではそれができるようになった (私はそう思います)。
type
TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80); // Only since Delphi 6