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