Inherited (heradar) uma função de uma classe.
Olá pessoal.
Estou tentando herdar um método que retorna Boolean. (Função).
Mas quando herdo ele não consegue pegar o Inherited. Dá tipo Incompatível.
O que pode ser?
Obrigado.
Yalle Cunha.
Estou tentando herdar um método que retorna Boolean. (Função).
Mas quando herdo ele não consegue pegar o Inherited. Dá tipo Incompatível.
O que pode ser?
Obrigado.
Yalle Cunha.
Yallebr
Curtidas 0
Respostas
Beppe
09/03/2005
Como fez as declarações?
GOSTEI 0
Yallebr
09/03/2005
Classe pai.
Classe Filho
O problema já começa o seguinte. Ele não coloca o Inherited automático. Caso não seja possível, eu posso achamar o método SALVA do pai no filho mas ai se eu colocar Salvar ele acha que é do filho e fica no Loop eterno.
Ex.
TFilho. function Salva: Boolean;
begin
Result := Salvar; //Loop eterno.
end;
function Salva: Boolean; virtual;
Classe Filho
function Salva: Boolean; override;
O problema já começa o seguinte. Ele não coloca o Inherited automático. Caso não seja possível, eu posso achamar o método SALVA do pai no filho mas ai se eu colocar Salvar ele acha que é do filho e fica no Loop eterno.
Ex.
TFilho. function Salva: Boolean;
begin
Result := Salvar; //Loop eterno.
end;
GOSTEI 0
Massuda
09/03/2005
Você tem que dizer explicitamente que quer chamar a função da classe pai:
TFilho. function Salva: Boolean; begin Result := inherited Salvar; end;
GOSTEI 0
Yallebr
09/03/2005
Olá Massuda,
Isso funcionou. Obrigado.
Porque eu precisei passar explicitamente que queria puxar do pai?
Caso fosse uma procedure eu poderia colar apenas
Inherited. Pois na declaração eu coloquei override;
No caso da função que adoto essa forma? Por que?
Muito obrigado.
Yalle Cunha.
Isso funcionou. Obrigado.
Porque eu precisei passar explicitamente que queria puxar do pai?
Caso fosse uma procedure eu poderia colar apenas
Inherited. Pois na declaração eu coloquei override;
No caso da função que adoto essa forma? Por que?
Muito obrigado.
Yalle Cunha.
GOSTEI 0
Beppe
09/03/2005
[b:b93d51af70]override [/b:b93d51af70]apenas ´diz´ que a classe terá uma nova implementação para certo método. [b:b93d51af70]inherited [/b:b93d51af70]serve pra chamar um método do pai, isto pq sem ele será assumida uma chamada ao filho, como pode ser o caso em uma função recursiva ou uma chamada de outro métdo da própria classe.
GOSTEI 0
Yallebr
09/03/2005
Olá Beppe
Obrigado pela ajuda.
Minha dúvida não seria bem essa, seria o seguinte.
Normalmente eu utilizo assim.
Nesse caso tive que fazer isso de forma Explicida.
Ficou claro ?
Yalle
Obrigado pela ajuda.
Minha dúvida não seria bem essa, seria o seguinte.
Normalmente eu utilizo assim.
TFilho. function Salva: Boolean; begin AlgumCodigo; inherited; //Isso chama o método Salva do pai. end;
Nesse caso tive que fazer isso de forma Explicida.
TFilho. function Salva: Boolean; begin Result := inherited Salvar; //inherited mais o nome do metodo. end;
Ficou claro ?
Yalle
GOSTEI 0
Beppe
09/03/2005
Ah, sim. O [b:8dea0aff55]inherited[/b:8dea0aff55] sozinho chama um método numa classe pai de mesmo nome que o método corrente. A não ser que vc teve um [i:8dea0aff55]mispelling[/i:8dea0aff55], vc tem os métodos Salvar e Salva.
Então, no método Salva, estes dois comandos são diferentes:
[b:8dea0aff55]inherited[/b:8dea0aff55] [i:8dea0aff55][/i:8dea0aff55];
[b:8dea0aff55]inherited[/b:8dea0aff55] Salvar;
Então, no método Salva, estes dois comandos são diferentes:
[b:8dea0aff55]inherited[/b:8dea0aff55] [i:8dea0aff55][/i:8dea0aff55];
[b:8dea0aff55]inherited[/b:8dea0aff55] Salvar;
GOSTEI 0
Yallebr
09/03/2005
OK ! Vou verificar.
Obrigado.
:D
Obrigado.
:D
GOSTEI 0
Massuda
09/03/2005
Nesse caso tive que fazer isso de forma Explicida.
Desculpe... :oops: talvez meu ´explicitamente´ tenha sido forte demais.
Eu acostumei (por motivos não relacionados ao Delphi) escrever sempre inherited + nome do método quando quero usar o método da classe pai em uma classe filho.
Normalmente, quando você escreve apenas inherited, como em...
TFilho. function Salva: Boolean; begin AlgumCodigo; Result := inherited; end;
Em algumas situações é preciso usar inherited + nome do método... Por exemplo, pode ser que o método em questão precise receber parâmetros e você quer passar parâmetros para o método da classe pai que são diferentes dos parametros que o método da classe filho recebeu. Assim, isso é perfeitamente válido:
TFilho. function Salva(A: TXyz): Boolean; var B: TXyz; begin AlgumCodigo; // Result := inherited; -> isso chama Salva(A) do pai. Result := inherited Salva(B); end;
A não ser que vc teve um mispelling, vc tem os métodos Salvar e Salva.
Como fiz apenas um copy&paste no código do Yalle, nem tinha percebido que estava escrito Salvar ao invés de Salva.GOSTEI 0