Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 687 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Olá a todos...

Digamos que eu tenho essas duas classes:

image.png.fd7545bb77a9350126b3c41a1189d47a.png

Com as seguintes implementações:

image.png.bce5ec1c8fd79c16c1b3b8769062dca8.png

Com isso, executando o comando abaixo:

image.png.7d8a00d5458c857a03c18e2bed6737ea.png

Vai executar primeiro o Constructor do Pai, depois do Filho... depois o Destructor do Filho e por fim o do Pai.

Pelo que li o INHERITED serve para executar o método existente na classe Pai, isso está correto? Até aí tudo bem.

Mas eu fiquei intrigado pelo fato do Destroy lá em TObject ser virtual e como tal precisarmos usar o override. Aí resolvei fazer igual no meu exemplo... Coloquei o Create do Pai como virtual e o do Filho como override, conforme abaixo:

image.png.39b1b3af529fc1719dca53cd9ebb2e0a.png

Da forma acima o comportamento ficou igual. Não mudou nada. Executou primeiro o Constructor do Pai, depois do Filho... depois o Destructor do Filho e por fim o do Pai. É isso mesmo? Tanto faz usar ou não o virtual/override no Create? Vai dar no mesmo? Se sim porque foi escolhido colocar o Destroy do TObject como virtual?

Desde já agradeço a atenção de todos

  • Membros Pro
Postado
1 hora atrás, Juliomar Marchetti disse:

tente remover no pai o corpo do constructor por ser virtual e deixar somente a declaração

Oi Juliomar, beleza?

Fiz conforme orientou... removi a implementação do construtor do Pai e deixei somente a declaração.

Ao fazer isso ele dá erro, conforme esperado, pois o método apesar de ser virtual, não é abstrato, então sua implementação se faz necessária. Qual seria o propósito dessa sua solicitação?

image.png.358c8e3835705fe9f3c0c95c3d2ab82e.png

 

  • Moderadores
Postado
9 minutos atrás, bnobre disse:

Oi Juliomar, beleza?

Fiz conforme orientou... removi a implementação do construtor do Pai e deixei somente a declaração.

Ao fazer isso ele dá erro, conforme esperado, pois o método apesar de ser virtual, não é abstrato, então sua implementação se faz necessária. Qual seria o propósito dessa sua solicitação?

image.png.358c8e3835705fe9f3c0c95c3d2ab82e.png

 

sim não lembrei de alem do virtual deveria ser abstrato

mas sim da sua dúvida é esse mesmo o comportamento

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

  • Membros Pro
Postado

Então basicamente usando o virtual/override ou não, nesse caso que exemplifiquei no Create daria no mesmo? Correto?

Eu fiquei com essa "pulga" atrás da orelha pelo fato do Destroy no TObject ser virtual e o Create não.

  • 2 semanas depois ...
  • Consultores
Postado

Eu não me lembro dos detalhes, mas acredito que isso tenha relação com as decisões lá no início da linguagem.

Bom eu lembro do seguinte:

Em 26/12/2022 at 16:07, bnobre disse:

Então basicamente usando o virtual/override ou não, nesse caso que exemplifiquei no Create daria no mesmo? Correto?

No Delphi/Lazarus, o "Constructor" sim nesse caso...

Mas isso funciona com todos os métodos... Por exemplo, sua classe TPai poderia ter uma "procedure FooBar" e a TFilho também ter esse método. Eles não precisam ser necessariamente virtuais.

A natureza do "Constructor", é ser um método da Classe, não do Objeto. Sendo assim, é esperado ele ser chamado na classe...

 Por exemplo o seguinte código gera uma AV:

var
 umPai: TPai;
begin
  umPai := umPai.Create;
//O código correto seria da classe:
  umPai := TPai.Create;

Já no Destructor isso não acontece. Ninguém chama "TPai.Destroy".

Na verdade, se você notar seu código, você chamou o método "Free". Esse método "Free" não é virtual.

Isso não explica plenamente sua dúvida, mas dá uma ideia do funcionamento... ou pelo menos mais coisas pra você pesquisar :D :rolleyes:

  • Curtir 1
  • Obrigado 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Consultores
Postado
  • Obrigado 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Este tópico foi criado há 687 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.