2010-01-23 17 views

Respuesta

9

Los operadores de conversión implícitos y explícitos para los registros de permisos sobrecarga por tipo de retorno: a saber, el tipo que se convierte en:

type 
    TFoo = record 
    class operator Implicit(const AFoo: TFoo): Integer; 
    class operator Implicit(const AFoo: TFoo): string; 
    end; 

Dependiendo del contexto, el uso de un valor de tipo TFoo llamará a la conversión implícita apropiada. Si intenta utilizar un valor de tipo TFoo como argumento a una rutina de sobrecarga que puede tomar ya sea entero o una cadena en esa posición, se producirá un error de sobrecarga:

test.pas(33) Error: E2251 Ambiguous overloaded call to 'Q' 
+ Test.pas(19) Related method: procedure Q(Integer); 
+ Test.pas(24) Related method: procedure Q(const string); 
+0

Ah, bueno, no del todo la respuesta que esperaba, pero interesante de todos modos. Aclamaciones. – HMcG

7

Puede tomar el "resultado" como parámetro.

procedure Blah(InVar : word; out OutVar : Byte); overload; 
procedure Blah(InVar : word; out OutVar : String); overload; 
+0

Sí, yo podría hacer esto, pero estoy actualizando un componente, y el método se implementa actualmente en función, por lo que si Cambié a una llamada de procedimiento que tendría que volver a recorrer todo el código llamándolo. – HMcG

1

Tomé la idea anterior e implementado en una tokenreader utilizado para importar datos. Cada token es una cadena, que luego se convierte al tipo apropiado. El código necesario para convertir a entero y cadena se encuentra en la parte inferior de la publicación.

Para leer y convertir una ficha sólo se necesita el siguiente código:

Myvalue := DataImporter.ImportToken; 

Dependiendo del tipo de MyValue, la conversión implícita correcta se dispara.


El código:

TTokenValue = record 
public 
    FValue:string; 
    constructor Create(const AValue:string); 
    class operator Implicit(const AFoo:TTokenValue): integer; 
    class operator Implicit(const AFoo:TTokenValue): string; 
end; 

Implementación

function TDataImporter.ImportToken: TTokenValue; 
begin 
    result := TTokenValue.Create(GetCurrentToken()); 
end; 

constructor TTokenValue.Create(const AValue: string); 
begin 
    FValue := AValue; 
end; 

class operator TTokenValue.Implicit(const AFoo: TTokenValue): integer; 
begin 
    result := strtointdef(AFoo.FValue, 0); 
end; 

class operator TTokenValue.Implicit(const AFoo: TTokenValue): string; 
begin 
    result:=AFoo.FValue; 
end; 
Cuestiones relacionadas