【问题标题】:How to implement Type-safe COM enumerations?如何实现类型安全的 COM 枚举?
【发布时间】:2010-09-07 00:41:46
【问题描述】:

如何在 COM 场景中在 Delphi 中实现类型安全枚举?基本上,我想用封装在类中的一组静态最终对象引用替换枚举的一组原始常量? . 在 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,我想在接口上声明一些枚举参数,不允许客户端对象传递整数(或长整数)类型来代替所需的枚举类型。 除了使用本机 delphi 枚举之外,您还有更好的方法来实现枚举吗?

【问题讨论】:

    标签: delphi com delphi-5


    【解决方案1】:

    本机 Delphi 枚举已经是类型安全的。 Java 枚举是该语言的一项创新,因为在此之前它根本没有枚举。但是,也许您的意思是不同的功能 - 以类型名称为前缀的枚举值。

    即将推出的 Delphi 2009 和 Delphi for .NET 产品的最后一个版本,支持一个名为 scoped 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.
    

    【讨论】:

      【解决方案2】:

      原生 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;
      

      【讨论】:

        【解决方案3】:

        现在你已经为我们提供了更多关于你的问题性质的线索,即提到 COM,我想我明白你的意思了。 COM 只能在 COM 服务器和客户端之间编组 Delphi 知道的类型的子集。您可以在 TLB 编辑器中定义枚举,但这些都是 TOleEnum 类型,基本上是整数类型(LongWord)。您可以拥有 TOleEnum 类型的变量,您可以使用任何所需的整数值,并将不同枚举类型的值相互分配。不是真正的打字安全。

        我想不出为什么 Delphi 的 COM 不能使用类型安全枚举来代替,但事实并非如此。恐怕对此无能为力。也许即将发布的 Delphi 2009 版本中 TLB 编辑器的更改可能会改变这一点。

        声明:当不使用 TLB 编辑器时,Delphi 完全能够与具有类型安全枚举作为参数的方法进行接口。

        【讨论】:

          【解决方案4】:

          我想我知道为什么 Borland 选择不在 TLB 编辑器中使用类型安全枚举。 COM 中的枚举可以是不同的值,而 Delphi 只有因为 Delphi 6(我认为)可以做到这一点。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-08-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-03
            相关资源
            最近更新 更多