Duvida em Procedure (override;virtual)

11/12/2003

42

Qual é o significado dos metodos override e virtual em procedure e para que eles servem um exemplo por favor.

Obrigado !!


Responder

Post mais votado

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:

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.


Responder

Mais Posts

11/12/2003

Rfpsatin

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


Responder

11/12/2003

Barcelos

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


Responder

11/12/2003

Vaginaldo

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



Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira