Pregunta

¿Cómo podría implementar enumeraciones de tipo seguro en Delphi en un escenario COM?Básicamente, me gustaría reemplazar un conjunto de constantes primitivas de una enumeración con un conjunto de referencias de objetos finales estáticos encapsulados en una clase..En Java podemos hacer algo como:

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

y hacer comparaciones utilizando el tipo de enumeración personalizado:

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

Actualmente estoy usando el antiguo Delphi 5 y me gustaría declarar algunos parámetros de enumeración en las interfaces, no permitiendo que los objetos del cliente pasen tipos enteros (o largos) en lugar del tipo de enumeración requerido.¿Tiene una mejor manera de implementar enumeraciones además de usar las enumeraciones nativas de Delphi?

¿Fue útil?

Solución

Ahora que nos ha proporcionado más pistas sobre la naturaleza de su pregunta, es decir, al mencionar COM, creo que entiendo lo que quiere decir.COM puede reunir sólo un subconjunto de los tipos que Delphi conoce entre un servidor COM y un cliente.Puede definir enumeraciones en el editor TLB, pero todas son del tipo TOleEnum, que básicamente es un tipo entero (LongWord).Puede tener una variable del tipo TOleEnum cualquier valor entero que desee y asignar valores de diferentes tipos de enumeración entre sí.Realmente no es seguro escribir.

No puedo pensar en una razón por la cual el COM de Delphi no pueda usar enumeraciones de tipo seguro, pero no es así.Me temo que no se puede hacer mucho al respecto.Quizás los cambios en el editor TLB en la próxima versión de Delphi 2009 puedan cambiar eso.

Para el registro:Cuando no se utiliza el editor TLB, Delphi es perfectamente capaz de tener una interfaz con métodos que tienen enumeraciones seguras de tipo como parámetros.

Otros consejos

Las enumeraciones nativas de Delphi ya tienen seguridad de tipos.Las enumeraciones de Java fueron una innovación para ese lenguaje, porque antes no tenía enumeraciones en absoluto.Sin embargo, quizás se refiera a una característica diferente: valores de enumeración con el prefijo de su nombre de tipo.

El próximo Delphi 2009 y la última versión del producto Delphi para .NET admiten una nueva directiva llamada enumeraciones con ámbito.Se parece a esto:

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

¿Qué hay de malo con las enumeraciones nativas de Delphi?Son seguros para escribir.

type
  TMyEnum = (Item1, Item2, Item3);

if MyEnum <> Item1 then...

Desde Delphi 2005 puedes tener constantes en una clase, pero Delphi 5 no.

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

Creo que sé por qué Borland elige no utilizar enumeraciones de tipo seguro en el editor TLB.Las enumeraciones en COM pueden tener valores diferentes, mientras que Delphi solo desde Delphi 6 (creo) puede hacer eso.

type
  TSomeEnum = (Enum1 = 1, Enum2 = 6, Enum3 = 80);  // Only since Delphi 6
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top