2008-08-27 17 views
2

COMシナリオでDelphiでタイプセーフな列挙型を実装するにはどうすればよいですか?基本的には、列挙のプリミティブ定数のセットを、クラスにカプセル化された静的な最終オブジェクト参照のセットに置き換えたいと思いますか? 。私は現在、古いデルファイ5を使用していますが、私はいくつか列挙型パラメータを宣言したいと思い型セーフなCOM列挙型を実装する方法は?

if (anObject != Enum.ENUMITEM1) ... 

:Javaでは 、我々のような何かを行うことができます。

public final class Enum 
{ 
    public static final Enum ENUMITEM1 = new Enum(); 
    public static final Enum ENUMITEM2 = new Enum(); 
    //... 
    private Enum() {} 
} 

をし、カスタマイズされた列挙型を使用して比較を行いますそのクライアントオブジェクトが、必要な列挙型の代わりに整数(または長い)型を渡すことを許可しないでください。 ネイティブのdelphi列挙型以外の列挙型を実装する方がいいですか?

答えて

1

今、あなたはすなわちCOMに言及、あなたの質問の性質についていくつかのより多くの手がかりを私たちに提供している、私はあなたが何を意味するかを理解すると思います。 COMは、DelphiがCOMサーバーとクライアントの間で知っているタイプのサブセットのみをマーシャリングできます。列挙型はTLBエディタで定義できますが、これらは基本的に整数型(LongWord)のTOleEnum型のすべてです。 TOleEnum型の変数に任意の整数値を設定し、異なる列挙型の値を互いに割り当てることができます。タイプセーフではありません。

デルファイのCOMが型安全な列挙型を代わりに使用できない理由は考えられませんが、そうではありません。私はそれについて多くのことができるのではないかと恐れています。おそらく、今後のDelphi 2009バージョンのTLBエディタの変更により、それが変更される可能性があります。

レコードの場合:TLBエディタを使用しない場合、デルファイは、型として安全な列挙型を持つメソッドと完全にインタフェースできます。

3

ネイティブの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; 
4

ネイティブのDelphiの列挙型はすでに型セーフです。 Javaの列挙は、以前は列挙がなかったので、その言語の革新でした。しかし、おそらく、別の機能、つまり型名の前に列挙値があることを意味します。

次回のDelphi 2009とDelphi for .NET製品の最新バージョンでは、スコープ付きenumsという新しい命令がサポートされています。それは次のようになります。

{$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. 
1

私は、なぜボーランドはTLBエディタでタイプセーフな列挙型を使用しないことを選択したのか分かります。 COMの列挙型は、Delphi 6(私が考える)がそうすることができるので、Delphiの間だけ異なる値にすることができます。

type 
    TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80); // Only since Delphi 6