Como verificar se uma classe já foi instanciada?

Delphi

27/03/2009

Pessoal, no Delphi tem como eu verificar Se uma classe já foi instanciada?
Eu quero fazer o seguinte:
Caso a classe já foi instanciada e ainda não foi destruida, então não crie novamente.
Caso a classe ainda não foi criada, então eu posso criar um objeto dela.

Aproveitando o gancho, tem como eu criar atributos e métodos estáticos no Delphi? assim como no Java, C#, etc?

Abraços.


[vaza]

[vaza]

Curtidas 0

Melhor post

Carlosfim

Carlosfim

28/03/2009

Classe Singleton em Delphi com construtor privado:


unit Unit2;

interface

type
   TClasseSingleton = class(TObject)
   private
      constructor Create();
   public
      class function getInstanciaClasseSingleton(): TClasseSingleton;
   end;

implementation

uses
   Sysutils, Dialogs;

var
   InstanciaArmazenada: TClasseSingleton;

constructor TClasseSingleton.Create;
begin
   inherited;
   InstanciaArmazenada := self;
end;

class function TClasseSingleton.getInstanciaClasseSingleton: TClasseSingleton;
begin
   if not assigned(InstanciaArmazenada) then begin
      TClasseSingleton.Create;
   end;
   result := InstanciaArmazenada;
end;

end.



Para obter uma instância de TClasseSingleton:

procedure TForm1.Button1Click(Sender: TObject);
var
   TesteSingleton: TClasseSingleton;
begin
   TesteSingleton := TClasseSingleton.getInstanciaClasseSingleton;
end;


O problema desta forma de implementar é que, ao contrário de outras linguagens, as classes no Delphi sempre terão um construtor público, que é o construtor padrão herdado de TObject.
Então, chamar getInstanciaClasseSingleton será uma convenção, e não uma regra imposta pela linguagem.


GOSTEI 1

Mais Respostas

Marco Salles

Marco Salles

27/03/2009

vamos par partes:

Eu quero fazer o seguinte: Caso a classe já foi instanciada e ainda não foi destruida, então não crie novamente. Caso a classe ainda não foi criada, então eu posso criar um objeto dela.


Isto se resolve por Padroes de projeto...O Padrao Singleton


Aproveitando o gancho, tem como eu criar atributos e métodos estáticos no Delphi?


Qaundo vc não define que o método é virtual ou Dynamico o delphi por
default o considera com sendo Estático .. Isto para Métodos ( Proceduree
e function ) Para Atributo , não faz muito sentido..

Mas melhor , bem melhor do que usar Metodos Virtuais e utilizar o
conceito de métodos de Class ..

Exemplo
TMinhaClasse = class
function Soma(a,b:integer):integer; //este mpetodo é Virtula
end;

TMinhaClasse = class
class function Soma(a,b:integer):integer; //Método de classe
end;


Se utiliza assim :

TMinhaClasse.Soma(10,5) .. Método aplicado a classe e não ao Objetos

Ok


GOSTEI 0
[vaza]

[vaza]

27/03/2009

Obrigado pela resposta amigo.
Então, eu pensei no singleTon, por esse motivo que estou questionando a respeito de método e atributo estático.

Me corrija se estou errado na minha lógica:
Toda vez que eu for criar uma classe, eu terei que criar chamando um método estatico (class function ....), correto?

Poderei fazer isso:

var
minhaclasse: TMinhaclasse;

class function Tminhaclasse.Instanciar: TMinhaclasse;
begin
if minhaclasse = nil then
minhaclasse := Tminhaclasse.Create;

result := minhaClasse;
end;


Dai quando eu quisesse criar uma classe, eu chamaria:
TMinhaclasse.Instanciar

estou correto?
Abraços.


GOSTEI 0
[vaza]

[vaza]

27/03/2009

Ops...nao da pra editar nesse forum :(
corrigindo:

Dai quando eu quisesse chamar a classe, eu faria:
TMinhaclasse.Instanciar;

estou correto?

A classe nesse caso acaba meio que virando abstrata, pq não poderei criar objetos a partir dela, caso eu coloque o construtor como privado. estou correto?

Abraços.


GOSTEI 0
Marco Salles

Marco Salles

27/03/2009

Normalmente a implementação do padrão é feita em Outra Classe

Tipo Isto

IMinhaClass = Interface
blablabla ; //metodo abastractos
end;


TMinhaClass = class (TInterfaceObject , IMinhaClass);
blabalabala //Redefinição dos métodos
end;


TMinhaClassSingleton = class
public
class Function Instance:IMinhaClass;
end;


var
MinhaClassGlobal:IMinhaClass;


class Function TMinhaClassSingleton.Instance:IMinhaClass;
begin
if MinhaClassGlobal = nil then
  MinhaClassGlobal:=TMinhaClass.Create;
resultMinhaClassGlobal;
end;


Para Usar .. Vc Faz :

var
UmObj:IMinhaClass;
begin
UmObj:=TMinhaClassSingleton.Create;
........

end;


Outras colocações ..

Colocar Constructor como Private...

vai ter a usabilidade Limitadíssima.... Somente na Unit que a define sera
possivel Instanciar Objetos. Portanto não tem efeito prático e nen de
POO ... Eu desconheço e nen imagino definir o Constructor como Private


GOSTEI 0
POSTAR