GARANTIR DESCONTO

Fórum Inherited (heradar) uma função de uma classe. #271668

09/03/2005

0

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.


Yallebr

Yallebr

Responder

Posts

09/03/2005

Beppe

Como fez as declarações?


Responder

Gostei + 0

09/03/2005

Yallebr

Classe pai.

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;


Responder

Gostei + 0

09/03/2005

Massuda

Você tem que dizer explicitamente que quer chamar a função da classe pai:
TFilho. function Salva: Boolean; 
begin
  Result := inherited Salvar;
end;



Responder

Gostei + 0

09/03/2005

Yallebr

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.


Responder

Gostei + 0

09/03/2005

Beppe

[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.


Responder

Gostei + 0

09/03/2005

Yallebr

Olá Beppe

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


Responder

Gostei + 0

09/03/2005

Beppe

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;


Responder

Gostei + 0

09/03/2005

Yallebr

OK ! Vou verificar.


Obrigado.

:D


Responder

Gostei + 0

09/03/2005

Massuda

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; 
...o fato de você estar querendo chamar o método do classe pai está implícito para o compilador.

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar