2015-09-15 18 views
12

È possibile avere due proprietà con lo stesso nome?È possibile avere due proprietà con lo stesso nome?

property Cell [Cl, Rw: Integer]: string read getCell write setCell; 
property Cell [ColName: string; Rw: Integer]: string read getCellByCol write setCellByCol; 

Bene, l'ho provato e il compilatore non me lo permette, ma forse c'è un trucco ...?

+0

'overload' non aiuta anche ... – Ampere

+0

È possibile attenersi a un metodo con i parametri 'variant' o' TField' dove si determina il tipo passato effettivo nel metodo stesso. –

+0

È possibile - una specie di. Vedere la risposta ... – HeartWare

risposta

25

No - ma poi di nuovo: Sì ... Sorta di ...

function getP1(Cl,Rw : integer) : string; 
procedure setP1(C1,Rw : integer ; const s : string); 
function getP2(const Cl : string ; Rw : integer) : string; 
procedure setP2(const C1 : string ; Rw : integer ; const s : string); 
property P1[Cl,Rw : integer] : string read getP1 write setP1; default; 
property P1[const Cl : string ; Rw : integer] : string read getP2 write setP2; default; 

Il trucco è quello di assegnare un nome alla proprietà lo stesso, e per segnare entrambi con clausola di "default". Poi si può accedere alla stessa nome di proprietà con diversi parametri:

P1['k',1]:=P1[2,1]; 
P1[2,1]:=P1['k',1]; 

compila fine.Don't so se questo è uffcialmente supportato o se ci sono alcuni altri problemi con esso, ma si compila bene e chiede la corretta getter/setter (testato in Delphi 2010).

Questo ovviamente funziona solo se non si utilizza già una proprietà predefinita per la classe, in quanto l'unico modo in cui sono riuscito a farlo funzionare è tramite la clausola predefinita.

+1

Sì, questo è ufficialmente supportato. La proprietà predefinita consente di accedere alla classe come una matrice. Il sovraccarico consente di accedere alla 'matrice' in modi diversi. Poiché i tipi di parametri variano, il compilatore è in grado di disambiguare il sovraccarico corretto. ..... Naturalmente perché non è consentito per le proprietà di array non predefinite è un mistero per me. – Johan

+0

Grazie a voi per l'osservazione. È stato davvero interessante leggere la tua risposta. Come pensi, è possibile utilizzare i generici per questo scopo? Attualmente sto pensando a 'TDictionary '. –

+4

In aumento, ho imparato qualcosa di nuovo! http://docwiki.embarcadero.com/RADStudio/Seattle/en/Properties#Array_Properties * Una classe può avere solo una proprietà predefinita con una determinata firma (elenco parametri array), ma è possibile sovraccaricare la proprietà predefinita. Cambiare o nascondere la proprietà predefinita nelle classi discendenti può portare a comportamenti imprevisti, dal momento che il compilatore si collega sempre alle proprietà staticamente. * – fantaghirocco

Problemi correlati