2010-06-07 14 views

Respuesta

18

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.

+1

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. –

+4

Entonces, la respuesta corta es que mientras los GUID son opcionales, no usarlos limita lo que puede hacer con las interfaces. –

+0

La necesidad de utilizar la función 'Compatible' es hasta ahora la única razón por la que defino los GUID para las interfaces. –

6

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; 
+0

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. –

+1

Si hay algo inseguro en el ejemplo que agregué arriba, házmelo saber, gracias. –

+0

@ 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. –

Cuestiones relacionadas