Fórum Como verificar se uma classe já foi instanciada? #369400
27/03/2009
0
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]
Curtir tópico
+ 0Post mais votado
28/03/2009
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.
Carlosfim
Gostei + 1
Mais Posts
27/03/2009
Marco Salles
Isto se resolve por Padroes de projeto...O Padrao Singleton
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
27/03/2009
[vaza]
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
27/03/2009
[vaza]
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
27/03/2009
Marco Salles
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 ..
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
Clique aqui para fazer login e interagir na Comunidade :)