Hallo Maximov,
wenn ich den Ursprung Deines Problems, das Verwenden einer Interfacereferenz als Schlüssel in einem Assoziativen Array (Dictionary) zu verwenden, richtig verstehe, könntest Du aus Performancegrunden die dafür gängige Variante des
hashing verwenden.
Weil Du zu diesem Zweck einen Hashwert aus einem eineindeutigen Schlüssel (hier: unter Zuhilfenahme der Interfacereferenz), bilden, Du die Schlüssel letztlich vergleichen musst und in Deinem Dictionary letztlich nur solche Schlüssel zugelassen werden können, die diese Eigenschaft aufweisen, bietet sich Hagens Ansatz, ein zusätzliches Interface einzuführen, geradezu an!
Weil Schlüssel jedoch prinzipiell nicht unbedingt "gehasht" werden können müssen, könnte man die Interfaces für Dictionary und Hashtables selbst wieder voneinander erben lassen, etwa in der Art
Delphi-Quellcode:
type
IIdentifiable = interface
function GetIdentity: Cardinal;
function IsSameTo(const AnIdentifiable: IIdentifiable): Boolean;
end;
IHashable = interface(IIdentifiable)
function GetHashValue: Cardinal;
function IsSameHashValueAs(const AHashable: IHashable): Boolean;
end;
Ich hoffe, die ADTs
Delphi-Quellcode:
type
TDictionary = class
procedure Add(const AKey: IIdentifiable; const AnObject: TObject);
procedure Remove(const AKey: IIdentifiable);
function Has(const AKey: IIdentifiable): Boolean;
function Get(const AKey: IIdentifiable): TObject;
//..
end;
THashtable = class
procedure Add(const AnObject: IHashable);
procedure Remove(const AnObject: IHashable);
function Has(const AnObject: IHashable): Boolean;
//..
end;
veranschaulichen, was ich meine.