2015-09-15 5 views
12

Ist es möglich, zwei Eigenschaften mit dem gleichen Namen zu haben?Ist es möglich, zwei Eigenschaften mit dem gleichen Namen zu haben?

Nun, ich habe es versucht und der Compiler wird mich nicht tun lassen, aber vielleicht gibt es einen Trick ...? Kein

+0

'overload' wird auch nicht helfen ... – Ampere

+0

Sie könnten bei einer Methode mit 'variant'- oder 'TField'-ähnlichen Parametern bleiben, wo Sie den tatsächlich übergebenen Typ in der Methode selbst bestimmen. –

+0

Es ist möglich - Art von. Siehe meine Antwort ... – HeartWare

Antwort

25

- aber dann wieder: Ja ... Sort of ...

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; 

Der Trick ist, die Eigenschaft das gleiche zu nennen, und beide zu markieren mit "default" Klausel. Dann können Sie den gleichen Eigenschaftsnamen mit verschiedenen Parametern aufrufen:

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

kompiliert fine.Don't wissen, ob dieser offziell unterstützt wird oder wenn es einige andere Probleme mit ihm ist, aber kompiliert es fein und ruft die richtige Getter/Setter (getestet in Delphi 2010).

Das funktioniert natürlich nur, wenn Sie nicht bereits eine Standardeigenschaft für Ihre Klasse verwenden, da ich sie nur über die Standardklausel erreichen konnte.

+1

Ja, das wird offiziell unterstützt. Mit der Standardeigenschaft können Sie auf die Klasse als Array zugreifen. Durch das Überladen können Sie auf verschiedene Arten auf das Array zugreifen. Da die Parametertypen variieren, kann der Compiler die korrekte Überladung entschlüsseln. ..... Natürlich, warum es nicht für nicht standardmäßige Array-Eigenschaften erlaubt ist, ist ein Rätsel für mich. – Johan

+0

Vielen Dank für die Beobachtung. Es war wirklich interessant, deine Antwort zu lesen. Wie denken Sie, ist es dann möglich, Generika für diesen Zweck zu verwenden? Ich denke gerade an 'TDictionary '. –

+4

Upvoted, ich habe etwas Neues gelernt! http://docwiki.embarcadero.com/RADStudio/Seattle/de/Properties#Array_Properties * Eine Klasse kann nur eine Standardeigenschaft mit einer bestimmten Signatur (Array-Parameterliste) haben, aber es ist möglich, die Standardeigenschaft zu überladen. Das Ändern oder Verbergen der Standardeigenschaft in untergeordneten Klassen kann zu unerwartetem Verhalten führen, da der Compiler immer statisch an Eigenschaften bindet. * – fantaghirocco

Verwandte Themen