2010-01-23 12 views

risposta

9

Gli operatori di conversione implicite ed esplicite per i record consentire sovraccarico per tipo di ritorno: vale a dire, il tipo da convertire:

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

seconda del contesto, utilizzando un valore di tipo TFoo chiamerà la conversione implicita appropriata. Se si cerca di utilizzare un valore di tipo TFoo come argomento a una routine di sovraccarico che può prendere o interi o stringhe in quella posizione, si verificherà un errore di sovraccarico:

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 bene, non proprio la risposta che speravo, ma interessante comunque. Saluti. – HMcG

7

È possibile utilizzare il "risultato" come parametro.

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

Sì, avrei potuto fare questo, ma sto aggiornando un componente, e il metodo è attualmente implementato come una funzione, quindi se Sono passato a una chiamata di procedura dovevo tornare indietro attraverso tutto il codice che la chiama. – HMcG

1

ho preso l'idea di cui sopra e implementato in un tokenreader utilizzato per l'importazione di dati. Ogni token è una stringa, che viene quindi convertita nel tipo appropriato. Il codice necessario per la conversione in intero e la stringa si trova nella parte inferiore del post.

da leggere e convertire un gettone è necessaria solo il seguente codice:

Myvalue := DataImporter.ImportToken; 

A seconda del tipo di MyValue, la corretta conversione implicita viene attivato.


Il codice:

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; 

Attuazione

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; 
Problemi correlati