So nun das Gegen-Beispiel
Delphi-Quellcode:
interface
type
IPool = interface
.. blabla
end;
function NPool: IPool;
implementation
type
TPool = class(TInterfacedObject, IPool);
.. blabla
end;
var
Pool: TPool = nil;
function NPool: IPool;
begin
if Pool = nil then Pool := TPool.Create;
Result := Pool;
end;
Hier wird nun Pool vom implementierenden Klassentyp sein, statt wie oben ein Interface. Ergo wirken auf die globale Variable Pool nicht die gleichen Wirkmechanismen wie sie bei Interfaces wirken. Damit ist also garantiert das Pool durch den Programmierer gegebenfalls manuell zerstört werden muß. Nun, das soll aber laut Rahmenbedingung nicht möglich sein. Relevant sind nun 3 Punkte:
1.) dieser Source wäre auch in neueren Delphi Versionen kompilierbar
2.) Pool ist in seiner Sichtbarkeit aber nicht auf NPool beschränkt, im nachfolgenden Source kann man also unbeabsichtigt darauf zugreifen
3.) da innerhalb von NPool das Object permanet bei jedemAufruf der Funktion erst in ein Interface umgewandelt werden muß ist die Performance dieser Funktion schlechter als im 1. Beispiel
Beides sind annehmbar gute Programmierstile und denoch gibt es große Unterschiede im schlußendlichen Laufzeitverhalten.
Gruß Hagen