La documentación oficial dice que son opcionales. Sé que la interoperabilidad COM requiere un identificador único para cada interfaz, pero cada ejemplo de interfaz que veo tiene un GUID ya sea que se use con COM o no. ¿Hay algún beneficio para incluir un GUID si no se va a usar con COM?¿Son necesarios los GUID para usar interfaces en Delphi?
Respuesta
me he dado cuenta de que algunos métodos tales como Supports
(para determinar si una clase se ajusta a una interfaz específica) requieren que se defina un GUID antes de poder utilizar ellos.
This page lo confirma con la siguiente información:
Nota: La unidad SysUtils proporciona una función de sobrecargado llamado Soporta que devuelve verdadero o falso cuando la clase tipos e instancias soportan una interfaz particular representado por a GUID. La función Soportes se utiliza en a la manera de Delphi es y como operadores . La diferencia significativa es que la función soportes pueden tomar como el operando de la derecha ya sea un GUID o un tipo de interfaz asociado con un GUID, mientras que es y como tomar el nombre de un tipo. Para obtener más información acerca de es y como, consulte las referencias de clase.
He aquí algunos interesting information about interfaces, que establece:
¿Por qué una interfaz necesitan ser único de identificación? La respuesta es simple: porque las clases Delphi pueden implementar múltiples interfaces. Cuando se ejecuta una aplicación , debe haber un mecanismo que obtenga el puntero en una interfaz adecuada de una implementación . La única forma de encontrar si un objeto implementa una interfaz y obtener un puntero a la implementación de esa interfaz es a través de los GUID.
Énfasis añadido en las dos citas.
La lectura de este artículo completo también hace que se dé cuenta de que QueryInterface
(que requiere un GUID) se utiliza detrás de escena por razones tales como el recuento de referencias.
Solo si necesita que su interfaz sea compatible with COM.
Por desgracia, que también incluye el uso de is
, as
operadores y QueryInterface
, Supports
funciones - la falta de lo cual es bastante limitante. Entonces, si bien no es estrictamente obligatorio, probablemente sea más fácil usar un GUID. De lo contrario, lo que queda es único uso más bien simplista:
type
ITest = interface
procedure Test;
end;
ITest2 = interface(ITest)
procedure Test2;
end;
TTest = class(TInterfacedObject, ITest, ITest2)
public
procedure Test;
procedure Test2;
end;
procedure TTest.Test;
begin
Writeln('Test');
end;
procedure TTest.Test2;
begin
Writeln('Test2');
end;
procedure DoTest(const Test: ITest);
begin
Test.Test;
end;
procedure DoTest2(const Test: ITest2);
begin
Test.Test;
Test.Test2;
end;
procedure Main;
var
Test: ITest;
Test2: ITest2;
begin
Test := TTest.Create;
DoTest(Test);
Test := nil;
Test2 := TTest.Create;
DoTest(Test2);
DoTest2(Test2);
end;
Eso no está bien; ver la respuesta de @eagle. La única forma en que puede usar una interfaz que no es COM sin un GUID es un lanzamiento inseguro y difícil. –
Si hay algo inseguro en el ejemplo que agregué arriba, házmelo saber, gracias. –
@ Craig: no estoy seguro de que existan "moldes peligrosos e inseguros" para las interfaces, ya que el compilador aún necesita alguna manera de ubicar la Tabla de interfaz para la interfaz que se está utilizando. –
- 1. ¿Son todos los permisos necesarios para PhoneGap en Android?
- 2. ¿Cuáles son los complementos necesarios en VIM para látex?
- 3. ¿Son necesarios FileChannel.force y FileDescriptor.sync?
- 4. ¿Son necesarios los archivos .OCA para la ejecución del programa?
- 5. ¿Los comentarios son necesarios para un lenguaje de programación?
- 6. ¿Los operadores de asignación "son necesarios" para regresar?
- 7. Son los atributos de DataContract necesarios para WCF
- 8. ¿Qué conjuntos son necesarios para MVC4?
- 9. ¿Los GUID generados en Windows 2003 son seguros para usar como ID de sesión?
- 10. ¿Qué permisos son necesarios para ejecutar Magento?
- 11. Interfaces de biblioteca virtual para Delphi/Win32?
- 12. ¿Por qué son necesarios los uri absolutos para los diccionarios fusionados en Generic.xaml?
- 13. ¿Qué Frameworks e importaciones son necesarios para usar AVAudioPlayer en iOS?
- 14. ¿Los GUID generados automáticamente para los tipos en .NET son consistentes?
- 15. C# Sintaxis de expresión lambda: ¿son necesarios los paréntesis?
- 16. ¿Cuáles son los campos de encabezados HTTP necesarios?
- 17. ¿Cuáles son las diferencias entre la implementación de interfaces en Delphi y Lazarus (FPC)?
- 18. Cuándo usar interfaces en Dart?
- 19. ¿Qué jarrones son exactamente necesarios para incrustar Neo4j?
- 20. ¿Qué permisos son necesarios para leer Active Directory como LDAP?
- 21. ¿Qué son las interfaces y los delegados en C#?
- 22. error Scala: encontrado y son necesarios misma
- 23. ¿Son necesarias las interfaces en JavaScript?
- 24. Anulación (deshabilitación) Conteo de referencias de Delphi para las interfaces
- 25. QSlider realiza los pasos necesarios
- 26. ¿Hay alguna herramienta que detecte GUID duplicados?
- 27. objetos Delphi, objetos NIL e interfaces
- 28. ¿Por qué son necesarios los archivos javascript predeterminados para crear un enlace de destrucción en los rieles?
- 29. Clases burlonas que no son interfaces
- 30. ¿Cuáles son los pasos necesarios para crear y publicar un rubygem propio?
Además, vale la pena señalar que el intento de utilizar un molde 'is' o' as' con una interfaz implica una de estas llamadas (no recuerdo cuál) bajo el capó, por lo que necesitará un GUID para hacerlo también. –
Entonces, la respuesta corta es que mientras los GUID son opcionales, no usarlos limita lo que puede hacer con las interfaces. –
La necesidad de utilizar la función 'Compatible' es hasta ahora la única razón por la que defino los GUID para las interfaces. –