Duvida em Procedure (override;virtual)
Qual é o significado dos metodos override e virtual em procedure e para que eles servem um exemplo por favor.
Obrigado !!
Obrigado !!
Leorez
Curtidas 0
Melhor post
Deus
11/12/2003
A diretiva [i:590be0b1f7]Virtual[/i:590be0b1f7] permite que um método de uma classe seja [i:590be0b1f7]Overrided[/i:590be0b1f7], ou seja, [i:590be0b1f7]substituído[/i:590be0b1f7] por um método de mesmo nome em uma subclasse, ou classe derivada.
Quando você quiser que outro programador possa reprogramar uma função de uma classe que você desenvolveu, você marca a função ou procedimento como [i:590be0b1f7]Virtual[/i:590be0b1f7].
A diretiva [i:590be0b1f7]Virtual[/i:590be0b1f7] pode ser seguida pela diretiva [i:590be0b1f7]Abstract[/i:590be0b1f7], o que irá modificar o efeito da diretiva [i:590be0b1f7]Virtual[/i:590be0b1f7], pois significará que o método não será implementado na classe atual, mas só nas suas subclasses (ou classes derivadas).
Já a diretiva [i:590be0b1f7]Override[/i:590be0b1f7] significa exatamente que você está [i:590be0b1f7]sobrescrevendo[/i:590be0b1f7] o método original de mesmo nome da classe pai.
Você pode, por exemplo, querer substituir o construtor da sua classe para inserir novas operações ou modificar algumas coisas ao passo que o objeto é instanciado. Lembrando que, se você usou a diretiva [i:590be0b1f7]Abstract[/i:590be0b1f7], você é [b:590be0b1f7]obrigado[/b:590be0b1f7] a usar [i:590be0b1f7]Override[/i:590be0b1f7] nas classes ´filhas´.
Um exemplo em código de tudo isso:
Espero que tenha sido útil! :) Se você tiver qualquer outra dúvida quanto aos métodos, ou da sua utilização, pode perguntar! ;) Abraços, dEUS.
Quando você quiser que outro programador possa reprogramar uma função de uma classe que você desenvolveu, você marca a função ou procedimento como [i:590be0b1f7]Virtual[/i:590be0b1f7].
A diretiva [i:590be0b1f7]Virtual[/i:590be0b1f7] pode ser seguida pela diretiva [i:590be0b1f7]Abstract[/i:590be0b1f7], o que irá modificar o efeito da diretiva [i:590be0b1f7]Virtual[/i:590be0b1f7], pois significará que o método não será implementado na classe atual, mas só nas suas subclasses (ou classes derivadas).
Já a diretiva [i:590be0b1f7]Override[/i:590be0b1f7] significa exatamente que você está [i:590be0b1f7]sobrescrevendo[/i:590be0b1f7] o método original de mesmo nome da classe pai.
Você pode, por exemplo, querer substituir o construtor da sua classe para inserir novas operações ou modificar algumas coisas ao passo que o objeto é instanciado. Lembrando que, se você usou a diretiva [i:590be0b1f7]Abstract[/i:590be0b1f7], você é [b:590be0b1f7]obrigado[/b:590be0b1f7] a usar [i:590be0b1f7]Override[/i:590be0b1f7] nas classes ´filhas´.
Um exemplo em código de tudo isso:
interface uses Forms, Dialogs, Classes, Controls, StdCtrls, SysUtils; type // Definir uma classe base TPolígono: // Esta classe será um triângulo se tiver 3 lados, um quadrilátero // se tiver 4, assim por diante. TPoligono = class private sideCount : Integer; // Quantos lados? sideLength : Integer; // Qual o comprimento do lado? shapeArea : Double; // Area do poligono protected procedure setArea; Virtual; Abstract; // So sera implementado no herdado property count : Integer read sideCount; property length : Integer read sideLength; property area : Double read shapeArea; constructor Create(sides, length : Integer); end; // Definir os descendentes: triangulo e quadrilatero. TTriangulo = class(TPoligono) protected procedure setArea; override; // Substituindo o metodo em abstract end; TQuadrilatero = class(TPoligono) protected procedure setArea; override; // Substituindo o metodo em abstract end; // Define the form class used by this unit TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} // Criando o objeto TPoligono constructor TPoligono.Create(sides, length : Integer); begin // Guardar o numero e tamanho dos lados sideCount := sides; sideLength := length; // Calcular a area chamando o metodo setArea : // Essa chamada só será feita por uma subclasse. setArea; end; // Implementar o metodo abstrato setArea para o triangulo. procedure TTriangulo.setArea; begin // Calcular e salvar a area do triangulo shapeArea := (sideLength * sideLength) / 2; end; // Implementar o metodo abstrato setArea para o quadrilátero. procedure TQuadrilatero.setArea; begin // Calcular e salvar a area do quadrilatero shapeArea := sideLength * sideLength; end; // Código principal procedure TForm1.FormCreate(Sender: TObject); var triangulo : TTriangulo; quadrado : TQuadrilatero; begin // Criando o triangulo e o quadrilatero triangulo := TTriangulo.Create(3, 10); quadrado := TQuadrilatero.Create(4, 10); // Mostrar a área dos polígonos: ShowMessageFmt(´Área do triângulo = ¬f´,[triangulo.area]); ShowMessageFmt(´Square area = ¬f´,[quadrado.area]); end; end.
Espero que tenha sido útil! :) Se você tiver qualquer outra dúvida quanto aos métodos, ou da sua utilização, pode perguntar! ;) Abraços, dEUS.
GOSTEI 2
Mais Respostas
Rfpsatin
11/12/2003
São conceitos de OO.
Override é uma palavra usada p/ o compilador entender que vc esta querendo sobreescrever um método(ou função ou procedure) por outro.
tipo
vc declara na classe pai
function teste()...
ae na filha vc quer sobre escrever ela, como vc faz?
redeclara ela indicando na frente esta palavrinha ´feia´ rs...
ae o compilador vai analizar e ver q por herança vc tem a função declarada na pai + vc esta escolhendo sobreescrever ela por esta nova.!! blz?
agora virtual é outro papo rs...
Override é uma palavra usada p/ o compilador entender que vc esta querendo sobreescrever um método(ou função ou procedure) por outro.
tipo
vc declara na classe pai
function teste()...
ae na filha vc quer sobre escrever ela, como vc faz?
redeclara ela indicando na frente esta palavrinha ´feia´ rs...
ae o compilador vai analizar e ver q por herança vc tem a função declarada na pai + vc esta escolhendo sobreescrever ela por esta nova.!! blz?
agora virtual é outro papo rs...
GOSTEI 0
Barcelos
11/12/2003
Olá,
Só complementando nosso amigo dEUS (você é ou já foi professor ? se não, pense nisso, você leva jeito :D ), não confunda o override com o overload (eu apanhei demais disso no ínicio). No caso do overload, você usa para marcar funções ou procedimentos que tenham nomes iguais mas parâmetros diferentes, ex:
Procedure Teste(X : String); overload;
Procedure Texte(X : Integer); overload;
No caso o compilador distingue uma da outra pelos parâmetros e você não [i:6ff2adfc87]sobrescreve[/i:6ff2adfc87] a função ou procedimento, já que apesar do mesmo nome elas são diferentes.
Espero ter ajudado,
Barcelos
osbarcelos@hotmail.com
Só complementando nosso amigo dEUS (você é ou já foi professor ? se não, pense nisso, você leva jeito :D ), não confunda o override com o overload (eu apanhei demais disso no ínicio). No caso do overload, você usa para marcar funções ou procedimentos que tenham nomes iguais mas parâmetros diferentes, ex:
Procedure Teste(X : String); overload;
Procedure Texte(X : Integer); overload;
No caso o compilador distingue uma da outra pelos parâmetros e você não [i:6ff2adfc87]sobrescreve[/i:6ff2adfc87] a função ou procedimento, já que apesar do mesmo nome elas são diferentes.
Espero ter ajudado,
Barcelos
osbarcelos@hotmail.com
GOSTEI 0
Vaginaldo
11/12/2003
Opa, isso ai!
Olá,
Só complementando nosso amigo dEUS (você é ou já foi professor ? se não, pense nisso, você leva jeito :D ), não confunda o override com o overload (eu apanhei demais disso no ínicio). No caso do overload, você usa para marcar funções ou procedimentos que tenham nomes iguais mas parâmetros diferentes, ex:
Procedure Teste(X : String); overload;
Procedure Texte(X : Integer); overload;
No caso o compilador distingue uma da outra pelos parâmetros e você não [i:e54d3acd86]sobrescreve[/i:e54d3acd86] a função ou procedimento, já que apesar do mesmo nome elas são diferentes.
Espero ter ajudado,
Barcelos
osbarcelos@hotmail.com
GOSTEI 0