Duvida em Procedure (override;virtual)
11/12/2003
0
Obrigado !!
Leorez
Post mais votado
11/12/2003
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.
Deus
Mais Posts
11/12/2003
Rfpsatin
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...
11/12/2003
Barcelos
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
11/12/2003
Vaginaldo
Clique aqui para fazer login e interagir na Comunidade :)