Avatar billede r9 Nybegynder
20. februar 2003 - 16:33 Der er 3 kommentarer og
3 løsninger

Singleton

Ifølge http://community.borland.com/article/0,1410,22576,00.html
skulle denne implementation af en singleton virke.

Men jeg får en fejl i denne linje:
Instance := inherited NewInstance;
[Error] SingletonUnit.pas(36): Incompatible types: 'TSingleton' and 'TObject'


unit SingletonUnit;

interface

type
  TSingleton = class
  public
    class function NewInstance: TObject; override;
    procedure FreeInstance; override;
    class function RefCount: Integer;
  end;

implementation

{ TSingleton }

var
  Instance  : TSingleton  = nil;
  Ref_Count : Integer    = 0;

procedure TSingleton.FreeInstance;
begin
  Dec( Ref_Count );
  if ( Ref_Count = 0 ) then
  begin
    Instance := nil;
    // Destroy private variables here
    inherited FreeInstance;
  end;
end;

class function TSingleton.NewInstance: TObject;
begin
  if ( not Assigned( Instance ) ) then
  begin
    Instance := inherited NewInstance;
    // Initialize private variables here, like this:
    //  TSingleton(Result).Variable := Value;
  end;
  Result := Instance
  Inc( Ref_Count );
end;

class function TSingleton.RefCount: Integer;
begin
  Result := Ref_Count;
end;

end.


jeg fårstår ikke fejlen da TSingleton jo er af typen 'TObject'.
Nogen som kan hjælpe?
Avatar billede dkn Nybegynder
20. februar 2003 - 17:24 #1
type
  TSingleton = class(TObject)

hjælper måske?
Avatar billede r9 Nybegynder
20. februar 2003 - 17:25 #2
nej.

TSingleton = class(TObject) er lig med TSingleton = class
Avatar billede dkn Nybegynder
20. februar 2003 - 17:40 #3
ok kan du så ikke bare create den sådan?:

class function TSingleton.NewInstance: TObject;
begin
  if ( not Assigned( Instance ) ) then
  begin
    Instance :=  TSingleton.Create;
    // Initialize private variables here, like this:
    //  TSingleton(Result).Variable := Value;
  end;
  Result := Instance;
  Inc( Ref_Count );
end;
Avatar billede doc404 Novice
20. februar 2003 - 20:07 #4
Hvis du har følgende

  Tx = class
  end;

  Ty = class(Tx)
  end;

var
  x : Tx;
  y : Ty;

kan du godt sætte
  x := y

men ikke y = x

Og det er det der sker i dit tilfælde du vil sætte en TSingleton = TObject

Løs det med

  Instance := TSingleTon(inherited NewInstance);
Avatar billede doctorseb Nybegynder
21. februar 2003 - 15:33 #5
Hej,

Designet er slet ikke pænt og problemet kan løses meget simplere (forbehold for trykfejl):

interface

type
  TS = class
  ...
  ...
  end;

function S: TS;

implementation

var
  theS: TS;

function S: TS;
begin
  if Assigned(S) then
    theS := TS.Create;
  result := theS;
end;

initialization
  theS := nil; // ikke nødvendigt, men for helhedens skyld...

finalization
  if Assigned(theS) then
    theS.Free;
Avatar billede doctorseb Nybegynder
21. februar 2003 - 20:40 #6
Rettelse:

function S: TS;
begin
  if not Assigned(theS) then
    theS := TS.Create;
  result := theS;
end;

Beklager... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester