Ir para conteúdo
  • Cadastre-se

dev botao

Dúvida sobre Herança - POO


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

Recommended Posts

  • Membros Pro

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

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
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

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores
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_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Consultores

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.
Link para o comentário
Compartilhar em outros sites

  • Consultores
  • 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.
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 480 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.