Fórum Método Abstrato #276714
11/04/2005
0
Grato,
TClassePai = class ... function MetodoAbstrato: Boolean; abstract; virtual ... end; TClasseFilho = class(TClassePai) ... //Não implementei a function MetodoAbstrato; ... end; ... ... ... procedure Qualuer; var objs : array of TClassePai; begin ... objs[0] := TClasseFilho.Create(...); ... if (TClassePai(objs).MetodoAbstrato) then begin //Vai dar erro, quero conferir se MetodoAbstrado está implementado end; end;
Marioguedes
Curtir tópico
+ 0Posts
11/04/2005
Marco Salles
e querer Acessar o [b:2334e448b9]MétodoAbstract é claro que ira dar erro[/b:2334e448b9] :cry: :cry: :cry:
A Palavra Chave[b:2334e448b9] <abstract>[/b:2334e448b9] e usada para declara métodos que serão definidos apenas nas [b:2334e448b9]subclasses[/b:2334e448b9] da classe atual
entao vejamos o exemplo:
var obj : TClassePai
Podemos por [b:2334e448b9]regra[/b:2334e448b9] usar um objeto de uma classe descendende sempre que um objeto de uma classe ancestral for esperado..
Assim podemos fazer:
obj:=TClasseFilho.Create
Agora sim , podemos Chamar o Método FunctionAbstracto
que nao iremos ter erro
Obj.MetodoAbstrato
Agora vamos ao caso de voce não implementar este método definido na classe ascendende na subclasse... [size=14:2334e448b9][color=red:2334e448b9][b:2334e448b9]Isto não faz sentido [/b:2334e448b9][/color:2334e448b9][/size:2334e448b9] :cry: :cry: :cry: :cry:
Agora vamos ao caso de voce [b:2334e448b9]ter definido [/b:2334e448b9]o método na subClasse então em RunTime voce deve usar o operador [b:2334e448b9]Is ou As [/b:2334e448b9]Para ver qual a classe Progenitora do Objeto
if Obj is TClasseFilho Then obj.MetodoAbstrato
em outra palavras ó operador is é [b:2334e448b9]avaliada[/b:2334e448b9] como [b:2334e448b9]true[/b:2334e448b9] somente se o Objeto tiver se referindo a um objeto da ClasseFilho
Gostei + 0
11/04/2005
Marioguedes
Suas respostas estão tecnicamente perfeitas.
O meu problema é que vou dar uma classe para cada programador da minha equipe desenvolver e cada classe tem um comportamento específico, quero me proteger de eventuais erros.
Se não houver alternativa melhor, vou usar um try except.
Mas de qualquer forma muito obrigado por sua avaliação.
function TMCTAcaoBase.Executar: Boolean; begin if (Log <> nil) then Log.Lines.Insert(0,Self.Nome); try Result := Self.ExecutarAcao; Result := True; except on E : Exception do begin Log.Lines.Add(´(´ + E.ClassName + ´) - ´ + E.Message); Result := False; end; end; end;
Gostei + 0
11/04/2005
Beppe
1) Verificar a exceção EAbstractError
2) Não marcar o método com abstract. Faça a função retornar False, se for o caso.
3) A RTL o Delphi 7 usa um truque para lidar com as versões de 32 e 64 bits de TStream(vide TStrem.Seek). Se uma for abstrata, chama a outra.
var Base, Impl: function(Offset: Longint; Origin: Word): Longint of object; B, I: TStream; begin // esta versão checa os métodos de 32 bits, que deve // prosseguir com a execução do programa // a versão de 64 bits chamaria Halt B := TStream.Create; I := TMemoryStream.Create; Base := B.Seek; Impl := I.Seek; if TMethod(Base).Code = TMethod(Impl).Code then Halt; end;
Fica a seu critério a escolha, é questão de estilo.
Gostei + 0
12/04/2005
Massuda
Normalmente quando se usa um método virtual abstrato em uma classe base isso significa que obrigatoriamente todas as classes derivadas devem implementar esse método.
Gostei + 0
12/04/2005
Marioguedes
[url]http://www.delphibasics.co.uk/RTL.asp?Name=AbstractErrorProc[/url]
Gostei + 0
12/04/2005
Massuda
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)