Você está na página 1de 15

Linguagem e Técnica de Programação II

ORIENTAÇÃO À OBJETO

Objetos e Classes
Objetos
Usamos o termo objeto para representar uma determinada entidade do mundo real. Em
um sistema de gerenciamento de biblioteca teríamos como objetos os livros da
biblioteca, os usuários e as movimentações realizadas, como empréstimos e
devoluções.

Um objeto possui propriedades, que são suas características, e métodos, que são as
funções que operam sobre o objeto. Um livro teria como propriedades, por exemplo, o
autor, a editora e o título. Entre os métodos que se aplicam ao livro, estaria o método
catalogar e o método movimentar.

Classes
Uma classe representa um conjunto de objetos que possuem características e
comportamentos comuns. No caso da biblioteca, esta possui além de livros, revistas.
Poderíamos dizer que tanto o objeto livro quanto o objeto revista pertencem a classe
Publicações, já que possuem as mesmas características e comportamentos.

Herança
É o mecanismo pelo qual uma classe obtém - propriedades e os métodos de uma outra
classe, para expandi-Ia ou especializá-Ia de alguma forma. O Delphi permite que você
crie novas classes baseadas em classses pré-existentes. Por exemplo, você pode criar
uma nova caixa de edição baseado em TEdit.

Quando uma classe herda propriedades e métodos de um outra classe, dizemos que a
nova classe é derivada da classe ancestral.

Instanciação
Chamamos o objeto de instância de uma determinada classe, o que significa que ele
possui os métodos e as propriedades definidos pela classe para suas instâncias. A
instanciaçã consiste em criar um novo objeto a partir de uma classe.

Metodologia de Orientação a Objetos

Prof. Menezes 1/15


Linguagem e Técnica de Programação II

A ênfase da metodologia de orientação a objetos é dada na definição de classes, e não


de objetos como se poderia pensar pelo nome.

A metodologia de programação orientada a objetos produz um código limpo, que é fácil


de entender e manter. Uma vez que você tenha criado um objeto em uma aplicação,
outra aplicações poderão utilizar o mesmo objeto reduzindo o tempo de
desenvolvimento.

“É comum utilizarmos o termo objeto para nos referirmos à classe. Por exemplo, TForm na realidade eu
ma classe que encapsuia propriedades e métodos do formulário. No entanto, utilizamos muitas vezes a
expressão objeto TForm.”

Classes, Componentes e Controles


Tanto os componentes quanto os controles são classes. O ícone Label, da Paleta de
Componentes, representa a classe TLabel, com determinadas propriedades (que
aparecem no Object lnspector) e métodos. Quando você insere um label no formulário,
cria um objeto da classe TLabel (que o Delphi normalmente nomeia Label1).

O ancestral de todas as classes do Delphi é TObject. Dela é derivada a classe


TPersistent, que possui todas as características de TObject, e propriedades, métodos e
eventos próprios. Da classe TPersistent é derivada a classe TComponent. Da classe
TComponenté derivada a classe TControl, que possui como característica própria, entre
outras, a habilidade de mostrar algo na tela.

Veja a seguir uma hierarquia simplificada das classes do Delphi:

TObject

TPersistent

TComponent

TControl

TForm TButton TListBox

Prof. Menezes 2/15


Linguagem e Técnica de Programação II

O Objeto Formulário
Quando você inicia um novo projeto no Delphi, na unit associada ao formulário é
declarado, na seção type, um nova classe de formulário, TForml, derivada do tipo
TForm:

type

TForml = class (TForm)

private

{Private declarations}

public

{Public declarations}

end;

A classe TForml inicialmente não possui propriedades ou métodos. Isto porque você não
incluiu qualquer componente em seu interior, e não deu origem a nenhum evento. Os
componentes inseridos em seu formulário são na realidade propriedades da classe
TForml. Os eventos gerados são na realidade métodos da classe TForml.

A seção uar da unit ligada ao formulário cria uma instância de TForml, chamada Forml .
Ou seja, cria um objeto Forml, da classe TForml:

var
Form1 : TForm1;

É necessário criar a variável Fonnl porque é nesta hora que criamos o objeto na
memória. Somente após criarmos o objeto na memória é que podemos manipulá-Ia (por
exemplo, mudar uma propriedade deste, ou inserir um componente). Ou seja, nós não
manipulamos a classe, e sim suas instâncias, ou seja, os objetos.

Agora, suponha que você insira um botão Buttonl em seu formulário, com um evento
OnClick associado, que muda o titulo do formulário quando clicado:

procedure TForml.SuttonlClick(Sender TObject);

begin

Forml.Caption:= 'Meu FormuLí.rio'

end;

Prof. Menezes 3/15


Linguagem e Técnica de Programação II

Ao inserir o botão e o evento acima, a seção type da unit passa a ter o seguinte
aspecto:
type

TForml = class (TForm)


Butto1 : l TButton;
procedure ButtonlClick( Sender: TObject};
private
{Private declarations} public

{Public declarations}

end;

A classe TForml possui agora uma propriedade chamada Buttonl, do tipo TButton, e um
método, a procedure ButtonlClick. O código do evento está na seção implementation.

Acessando Propriedades e Métodos de um Objeto


Para utilizar uma propriedade ou método _ um objeto, utilize a seguinte sintaxe:

<objeto>.propriedade

ou

<objeto>.método

N a realidade, quando você se refere - Editl.Caption, você está se referindo -


Forml.Editl.Caption. Só que, como Editl f declarado dentro da declaração de tipo de
TForml, não é necessário colocar Forml no iníci do comando.

Herdando Propriedades e Métodos de uma Classe


Como vimos, quando você cria um novo formulário, o Delphi deriva a classe TForml do
tipo TForm:

TForml = class(TForm)

Como TForml é derivado de TForm, todos os elementos que pertencem ao tipo TForm
automaticamente se tornam parte do tipo TForml. Ou seja, TForml possui todas as
propriedades, métodos e eventos de TForm. V ocê pode utilizar todos estes elementos
de TForm, em TFõrml. Mas apenas os componentes adicionados a TForm l=e -os

Prof. Menezes 4/15


Linguagem e Técnica de Programação II

eventos gerados aparecem na declaração de tipo de TForml. São os elementos que


fazem TForml diferente de TForm.

A classe de onde a nova classe é derivada se chama ancestral. A nova classe se chama
descendente. Uma classe possui somente um ancestral, mas pode, possuir muitos
descendentes.

Todas as propriedades e métodos declarados dentro da declaração da classe estão


dentro do escopo da classe, e são passíveis de uso por suas instâncias e seus
descendentes. O descendente não pode criar uma propriedade com o mesmo nome de
uma propriedade da classe ancestral, recebendo uma mensagem de erro caso isso
ocorra.

Mas você pode declarar um método com o mesmo nome do método da classe ancestral.
Neste caso, você está sobrepondo (override) o método da classe ancestral.

Você também pode inserir em urna classe propriedades que não componentes, e
métodos que não eventos. Você pode adicionar novas propriedades e métodos na parte
private ou public da declaração da classe.

Use a parte public para declarar propriedades que você quer que sejam acessadas
pelos métodos da classe e por outras units. Use também para declarar métodos que
você queira que objetos de outras units usem.

Use a parte private para restringir o acesso a propriedades e métodos. Por exemplo,
declare nesta parte propriedades que você queira que só os métodos da unit corrente
acesse. Use também para declarar métodos que você queira que só os objetos
definidos na unit corrente acesse.

Para adicionar propriedades ou métodos nas partes public e private, escreva a


declaração das propriedades antes da declaração dos métodos.

Veja um exemplo a seguir:

type

TForml = class (TForm)


Buttonl TButton;
procedure ButtonlClick( Sender: TObject);
private
{Private declarations}
Numero Integer;
function Calcula(X,y: Integer): Integer;
public
{Public declarations}
procedure MudaCor;
end;

Prof. Menezes 5/15


Linguagem e Técnica de Programação II

A procedure MudaCor é pública, podendo ser acessada de outra uní t (não esqueça de
acrescentar a unitreferellte a Forml na seção uses da unít que está chamallqo o método
MudaCor de Forml):

Forml.MudaCor;

Operações de Typecasting com Objetos


O Operador As
o operador as é usado para realizar operações de typecasting. A sintaxe é:

Referencia_do_ Objeto as Referencia_ da_ Classe

ou

Referencia_ da_ Classe (Referencia_do_ Objeto );

O valor resultante é uma referência ao mesmo objeto referenciado em


Referencia_do_Objeto, mas Com o tipo de dado de Referencia_ da_Classe.

Durante a execução da aplicação, o objeto precisa ser nil, um objeto da classe ou um


objeto de classe derivada da classe referida. Senão, uma exceção será gerada.

Por exemplo:

with Sender as TButton do


begin
Caption := '&Ok';
OnClick := OkClick;
end;

O Operador Is
O operador is é usado para realizar checagem dinâmica de tipos durante a execução da
aplicação. Usando este operador, é possível verificar se um objeto pertence a uma
classe. A sintaxe é:

Referencia_do_ Objeto is Referencia_ da_ Classe

O operador is retorna um valor booleano. O resultado é True se o objeto é uma instancia


da classe, ou uma instancia de uma outra classe derivada da classe referida.

Prof. Menezes 6/15


Linguagem e Técnica de Programação II

O operador is é frequentemente usado em conjunto com um comando if para realizar


uma operação de typecasting segura. Por exemplo:

if ActiveControl is TEdit then TEdit(ActiveControl) .SelectAll;

Ou seja, se o resultado de ActiveControl is TEdit for verdadeiro, é seguro realizar a


operação de typecasting TEdit(ActiveControl).SelectAll.

Exemplo

O exemplo abaixo usa o operador is para criar uma rotina que permite a passagem de
uma caixa de edição para outra através da tecla Enter (ao invés de Tab, padrão do
Windows):

procedure TForm1.alturaKeyPress(Sender: TObject; var Key: Char);


var
ordem : integer;
i : integer;
begin
if ord(key) = 13 then
begin
ordem := TEdit(Sender).TabOrder;
ordem := ordem + 1;
for i := 0 to form1.ComponentCount - 1 do
begin
if (form1.Components[i] is TEdit)
and (TEdit(form1.Components[i]).TabOrder = ordem) then
begin
TEdit(form1.Components[i]).setfocus;
break;
end;
end;
end;

end;

Prof. Menezes 7/15


Linguagem e Técnica de Programação II

Criando Novas Classes


Escolhendo a Classe Ancestral
Através do mecanismo de herança, o Delphi permite que você crie novas classes,
herdando propriedades e métodos de outra já existente.

A classe mais básica da hierarquia de classes do Delphi é TObject. Ou seja, a nova


classe deve derivar pelo menos de TObject. É claro que se você quiser criar uma classe
que opere com impressão, irá derivá-Ia de TPrinter, bem mais especializada que
TObject.

Neste capítulo veremos como criar classes simples, derivadas de TObject ou de outra
classe pré-definida pelo Delphi. No capítulo seguinte veremos como criar classes de
componentes.

Declarando a Classe
Para declarar uma nova classe, inicie um novo projeto e, na seção type da unit, escreva:

type
TNovaClasse = class (TClasseBase)

Por convenção, toda classe tem o nome iniciado pela letra T.

Suponha que você queira criar uma classe Tl.ívro, que encapsule propriedades e
métodos dos livros manipulados em uma biblioteca.

Para criar a classe TLivro, você faria:

type TLivro

class(TObject)

Após a declaração da classe, você poderia acrescentar as propriedades e métodos


referentes a nova classe criada. Por exemplo, se a classe TLívro tiver os campos Nome,
Autor e Editora, e o método Empréstimo, teremos:

type
TLivro = class(TObject)
Nome string[35];
Autor string[35];
Editora string[35];
function Emprestimo: boolean;
end;

Prof. Menezes 8/15


Linguagem e Técnica de Programação II

Como TLivro é derivada de TObject, contém todos os métodos deste.

Declarando Objetos da Classe


Na seção var da unit você preCIsa declarar a variável do tipo TLivro:
var
Livro1 : TLivro;

No exemplo acima, Liorol é uma referência a um objeto da classe TLivro.

A Função Construtora da Classe


TLivro é apenas uma classe. Ela não existe na memória até que seja instanciada, isto é,
dê origem a um objeto. Um objeto de determinada classe é criado por uma chamada a
função construtora da classe.

Uma função construtora é um método que aloca memória para o novo objeto e aponta
para este, que é chamado de intância da classe.

Toda classe derivada de TObject possui a função construtora Create. Portanto, para
criar uma instancia de classe, use o método Create:

Nome_Objeto := TClasse.Create;

Por exemplo, para criarmos uma instancia da classe TLivro, usaremos o método Create:

Livrol := TLivro.Create;

A partir de agora, você poderá se referir aos campos de TLivro através da variável
Livrol. Por exemplo, para se referir ao campo Nome da classe TLivro, faça:

Livrol.Nome

A Função Destrutora da Classe


Se você criou um objeto através do método Create, deve destruí-Ia após usá-Ia,
desalocando a memória utilizada.

Você destrói um objeto através de uma função destrutora. O Delphi possui duas funções
destrutoras: Free e Destroy. Você deve sempre usar a função destrutora Free.

No nosso exemplo, para destruírmos o objeto Livro l, faríamos:

Livrol.Free;

Prof. Menezes 9/15


Linguagem e Técnica de Programação II

TLivro pode utilizar o método Free para destruir uma instância de sua classe porque
herdou este método de TObject.

Exemplo

Vamos criar uma aplicação que armazena dados através de um objeto da classe
TStringList, sem utilizar um componente ListBox ou Combobox.

O formulário contém uma caixa de edição e um botão. O usuário entra o dado na caixa
de edição e, ao clicar no botão, adiciona o dado a uma lista, ou seja, a um objeto do tipo
TStringList. Ao finalizar a aplicação, a lista é salva em um arquivo texto.

A classe TStringList não precisa ser criada porque ela já é oferecida pelo Delphi. Para
utilizar o objeto do tipo TString l.ist, temos que criá-lo através do método Create, e
destruí-Ia através do método Free. Veja o código abaixo:
unit livro_01;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Class_Area;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Lista : TStringList;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);


begin
Lista := TStringList.Create;

Prof. Menezes 10/15


Linguagem e Técnica de Programação II

end;

procedure TForm1.FormDestroy(Sender: TObject);


begin
Lista.SaveToFile('Exemplo.Txt');
Lista.Free;
end;

procedure TForm1.Button5Click(Sender: TObject);


begin
Lista.Add(Edit1.Text);
end;

end.

Usando a Nova Classe


Para usar a classe criada, em primeiro lugar ;:, preciso compilar seu projeto, para gerar
arquivo. DeU correspondente a unit com pilada

Agora, basta se referenciar à unit da classe - cláusula uses da seção interface (coloque
a compilada da classe na mesma pasta onde ficar o projeto que a usará). Depois, na
seção var, crie um objeto da classe. A partir daí, basta se refe . às propriedades e
métodos necessários.
Exemplo

Vamos criar agora uma classe chamada T Area, com duas propriedades: Altura e
Largura. A classe TArea possui um método chamado CalculaArea, que calcula a área
da superfície.

Como esta classe não está associada a nenhum formulário, para criá-Ia siga os passos
abaixo:

 inicie uma nova aplicação;

 adicione uma nova unit, através do menu File, opção New, item Unit;

 remova a primeira unit oferecida quando você criou a aplicação. Agora, sua
aplicação possui apenas uma unit, que não está associada a nenhum
formulário:
unit Class_Area;

interface
type
TArea = class (TObject)
Altura : integer;

Prof. Menezes 11/15


Linguagem e Técnica de Programação II

Largura : integer;
function CalculaArea : double;
function CalculaAreaParametro
(vAltura : integer; vLargura : integer)
: double;
end;
implementation

function TArea.CalculaArea : double;


var
TArea1 : TArea;
begin
TArea1 := TArea.Create;
TArea1.Altura := 20;
TArea1.Largura := 3;
Result := TArea1.Altura * TArea1.Largura;
end;

function TArea.CalculaAreaParametro
(vAltura : integer; vLargura : integer) : double;
var
TArea1 : TArea;
begin
TArea1 := TArea.Create;
TArea1.Altura := vAltura;
TArea1.Largura := vLargura;
Result := TArea1.Altura * TArea1.Largura;
end;

end.

A unit é salva com o nome Classe_Area, e o projeto com o nome ClasseArea. Não
esqueça de compilar a unit que declara a classe, através de Project Compile, para dar
origem ao arquivo .DCU correspondente ..

Para testarmos a classe TArea, vamos-criar uma nova aplicação. Nesta aplicação, ao
clicarmos em um botão, chamamos um método da classe TArea para calcular a área, e
o resultado do cálculo é mostrado em uma caixa de edição.

Para podermos criar um objeto da classe TArea, precisamos acrescentar a unit


UnitArea, onde a classe TArea é declarada, a lista de units da seção uses.

Note que a unit UnitArea, que cria a classe T Area, está inserida na cláusula uses da
unit q e testa a classe.

Prof. Menezes 12/15


Linguagem e Técnica de Programação II

Por causa disso, antes de executarmos - aplicação, precisamos salvá-Ia, na mesma pas
que está a unit UnitArea compilada. Vamos da! o nome de FrmTestaClasse para o
formulário, e TestaClasse para o projeto. Agora, ao executarmos

a aplicação, e clicarmos no botão, o valor 60 é inserido na caixa de edição.

Exemplo

O exemplo a seguIr oferece ao usuário um formulário contendo um ícone (um Speed


Button) para criação de retângulos. Quando o usuário. clicar sobre o ícone que
representa o retângulo, e mover o mouse sobre uma determinada região do formulário,
criará um retângulo.

Isto é feito através da nova classe TRetangulo, derivada de TObject, que possui como
propriedades as coordenadas do retângulo e como método uma função para desenhar o
retângulo.

unit novc3;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons;

type
TForm1 = class(TForm)
SpeedButton1: TSpeedButton;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SpeedButton1Click(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TRetangulo = class(TObject)
x1, y1, x2, y2 : integer;
procedure Desenha(px1, py1, px2,py2 : integer);
end;
var
Form1: TForm1;
Retangulo1 : TRetangulo;

Prof. Menezes 13/15


Linguagem e Técnica de Programação II

implementation
{$R *.DFM}

var
px1, px2, py1, py2 : integer;

procedure TRetangulo.Desenha(px1, py1, px2,py2 : integer);


begin
Retangulo1.x1 := px1;
Retangulo1.x2 := px2;
Retangulo1.y1 := py1;
Retangulo1.y2 := py2;
form1.Canvas.Rectangle(Retangulo1.x1, Retangulo1.y1,
Retangulo1.x2, Retangulo1.y2);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
begin
if SpeedButton1.Tag = 1 then
begin
px1 := x;
py1 := y;
end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);


begin
SpeedButton1.Tag := 1;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
begin
if speedButton1.Tag = 1 then
begin
px2 := x;
py2 := y;
Retangulo1 := TRetangulo.Create;
Retangulo1.Desenha(px1, py1, px2, py2);
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);


begin
Retangulo1.Free;

Prof. Menezes 14/15


Linguagem e Técnica de Programação II

end;

end.

Prof. Menezes 15/15

Você também pode gostar