Hmm, was ist effektiv der Unterschied zwischen SirTs Lösung und einer globalen Vatriablen?...
Um dich nicht mit Interfaces zuzuschütten empfehle ich dir erstmal ein Singleton welches aus einer absrtakten öffentlichen Klasse und einer versteckten Klasse besteht, die die seine Member implementiert.
Um zu verhindern, dass die Instanz zerstört wird, wird eine
Exception im Destructor ausgelöst.
Delphi-Quellcode:
interface
type
TSingletonMoneyDings =
class
private
function getMoney: Currency;
virtual;
abstract;
procedure setMoney(
const aValue: Currency);
virtual;
abstract;
public
property Money: Currency
read getMoney
write setMoney;
class function Instance: TSingletonMoneyDings;
end;
implementation
uses
SysUtils;
type
TRichtigesMoneyDings =
class(TSingletonMoneyDings)
private
fMoney: Currency;
fAllowDestruction: Boolean;
function getMoney: Currency;
override;
procedure setMoney(
const aValue: Currency);
override;
public
destructor Destroy;
override;
end;
InvalidSingletonDestructionException =
class(
Exception)
public
constructor Create;
end;
var
staticMoneyDings : TRichtigesMoneyDings;
{ TSingletonMoneyDings }
class function TSingletonMoneyDings.Instance: TSingletonMoneyDings;
begin
Result := staticMoneyDings;
end;
{ TRichtigesMoneyDings }
destructor TRichtigesMoneyDings.Destroy;
begin
if fAllowDestruction
then
inherited
else
raise InvalidSingletonDestructionException.Create();
end;
function TRichtigesMoneyDings.getMoney: Currency;
begin
Result := fMoney;
end;
procedure TRichtigesMoneyDings.setMoney(
const aValue: Currency);
begin
fMoney := aValue;
end;
{ InvalidSingletonDestructionException }
constructor InvalidSingletonDestructionException.Create;
begin
inherited CreateFmt('
%s can not be destroyed at this time.', [TMoneyDings.ClassName]);
end;
initialization
staticMoneyDings := TRichtigesMoneyDings.Create();
staticMoneyDings.fAllowDestruction := False;
finalization
staticMoneyDings.fAllowDestruction := True;
staticMoneyDings.Free();
end.
Benutzen kannst du sie von überall aus über Instanz:
TSingletonMoneyDings.Instance.Money := 1