Как реализовать типобезопасные перечисления COM?

StackOverflow https://stackoverflow.com/questions/30529

  •  09-06-2019
  •  | 
  •  

Вопрос

Как я могу реализовать типобезопасные перечисления в 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, и я хотел бы объявить некоторые параметры перечислений в интерфейсах, не позволяя клиентским объектам передавать целые (или длинные) типы вместо требуемого типа перечисления.Есть ли у вас лучший способ реализации перечислений, кроме использования собственных перечислений Delphi?

Это было полезно?

Решение

Теперь вы предоставили нам еще несколько подсказок о природе вашего вопроса, а именно упоминания COM, я думаю, я понимаю, что вы имеете в виду.COM может маршалировать только подмножество типов, известных Delphi, между COM-сервером и клиентом.Вы можете определить перечисления в редакторе TLB, но все они относятся к типу TOleEnum, который по сути является целочисленным типом (LongWord).Вы можете иметь переменную типа TOleEnum любое целочисленное значение и присваивать друг другу значения разных типов перечислений.Не совсем типобезопасно.

Я не могу придумать причину, по которой COM Delphi не может использовать вместо этого типобезопасные перечисления, но это не так.Боюсь, с этим ничего нельзя поделать.Возможно, изменения в редакторе TLB в будущей версии Delphi 2009 изменят ситуацию.

Для записи:Когда редактор TLB не используется, Delphi вполне может иметь интерфейс с методами, которые имеют типобезопасные перечисления в качестве параметров.

Другие советы

Собственные перечисления Delphi уже являются типобезопасными.Перечисления в Java были новшеством для этого языка, поскольку раньше в нем вообще не было перечислений.Однако, возможно, вы имеете в виду другую функцию — значения перечисления, предшествующие имени их типа.

Предстоящий Delphi 2009 и последняя версия продукта Delphi для .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, в классе можно использовать константы, а в Delphi 5 — нет.

type
  TMyEnum = sealed class
  public
    const Item1 = 0;
    const Item2 = 1;
    const Item3 = 2;
  end;

Думаю, я знаю, почему Borland решила не использовать типобезопасные перечисления в редакторе TLB.Перечисления в COM могут иметь разные значения, а в Delphi только потому, что Delphi 6 (я думаю) может это делать.

type
  TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80);  // Only since Delphi 6
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top