Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introdução a
Orientação a Objetos
com Delphi
PROGRAMAÇÃO
ORIENTADA A OBJETOS
HISTÓRIA
A
ntes de tudo, é muito importante esclarecer que
o termo OOP ou Object-Oriented Programming
não se aplica somente a um modelo de
programação, e muito menos se restringe a paradigmas como
herança, polimorfismo e encapsulamento. OOP é um conceito
muito mais amplo do que imaginamos, e muito mais complexo.
Por mais estranho que pareça ser, a ideia da Orientação a
Objetos surgiu através das primeiras linguagens a usar este
conceito, SIMULA I entre (1962-1965) e SIMULA 67 (1967). O
Simula 67 (SIMUlation LAnguage) empregou os principais
pontos chave da orientação a objetos, classes e objetos,
herança, métodos virtuais. A linguagem Simula foi
desenvolvida no Centro Norueguês de Computação em Oslo,
Noruega, por Ole-Johan Dahl e Kristen Nygaard.
portal.rmfactory.com.br
2 Introdução a Orientação a Objetos com Delphi
portal.rmfactory.com.br
3 Introdução a Orientação a Objetos com Delphi
Gerais:
portal.rmfactory.com.br
4 Introdução a Orientação a Objetos com Delphi
• Congelado em 1968
• Caro
• Não tem uma IDE moderna
• Muito complicado
• Publicações insuficientes
Características da linguagem:
Características OOP:
Simulação:
portal.rmfactory.com.br
5 Introdução a Orientação a Objetos com Delphi
portal.rmfactory.com.br
6 Introdução a Orientação a Objetos com Delphi
C
ostumo dizer que a orientação a objetos não é a
solução para todos os problemas. Há um ditado
que retrata muito bem isto: "quando a única
ferramenta que temos na mão é um martelo, tudo vira prego".
A ideia da OOP é agregar a modelos de programação
estruturados e modular paradigmas que trazem benefícios
objetivos.
CLASSES E OBJETOS
Eu poderia aqui fazer uma grande dissertação
acadêmica falando de classes e objetos, os comparando a
bolos, carros, pessoas etc. Acredito que depois de mais de 30
portal.rmfactory.com.br
7 Introdução a Orientação a Objetos com Delphi
portal.rmfactory.com.br
8 Introdução a Orientação a Objetos com Delphi
portal.rmfactory.com.br
9 Introdução a Orientação a Objetos com Delphi
DECLARAÇÕES FORWARD
Frequentemente quando trabalhamos com classes é
comum nos depararmos com a situações de mútua
dependência, ou seja, duas classes que fazem referência uma
as outras:
TClassA = class
B: TclassB; //erro aqui!
end;
TclassB = class
A: TclassA;
end;
TClassA = class
B: TClassB;
end;
portal.rmfactory.com.br
10 Introdução a Orientação a Objetos com Delphi
TClassB = class
A: TclassA;
end;
META CLASSES
Meta Classes são estruturas referência para classes, que
podem ser utilizadas no código para aumentar a flexibilidade.
A declaração de um “tipo referência de classe” é feita através
da diretiva “class of”.
TMetaCliente = class of TCliente;
TBaseClass = class
end;
TCliente = class(TBaseClass)
Nome: string;
end;
TFuncionario = class(TBaseClass)
Matricula: string;
end;
portal.rmfactory.com.br
11 Introdução a Orientação a Objetos com Delphi
function TForm1.GetObjectInstance(Meta:
TMetaBaseClass): TBaseClass;
begin
result := Meta.Create;
end;
Com
isso podemos
criar instancias de
objetos
genéricos
sem conhecer
suas estruturas
originais.
var
Cliente: TCliente;
Funcionario: TFuncionario;
begin
Cliente:= GetObjectInstance(TCliente) as TCliente;
Funcionario := GetObjectInstance(TFuncionario) as
TFuncionario;
end;
HERANÇA
Herança realmente é um mecanismo poderoso da
orientação a objetos, mas objetivamente não é a panacéia
tecnológica. Neste observaremos que valorizam essa prática e
outras as quais ela trás prejuízos. Herança agrega evidente
reaproveitamento de código, onde verdadeira estruturas
codificadas podem se especializadas em uma nova classe.
Quando falamos em herança dois termos precisam ser
esclarecidos: Generalização e Especialização.
portal.rmfactory.com.br
12 Introdução a Orientação a Objetos com Delphi
portal.rmfactory.com.br
13 Introdução a Orientação a Objetos com Delphi
INTERFACES
portal.rmfactory.com.br
14 Introdução a Orientação a Objetos com Delphi
ICalculator = interface
function ExecuteCalc(a,b: Double): Double;
end;
portal.rmfactory.com.br
15 Introdução a Orientação a Objetos com Delphi
implementation
uses
SysUtils;
portal.rmfactory.com.br
16 Introdução a Orientação a Objetos com Delphi
result := a * b;
end;
Cliente:
var
a, b, rSum, rMult: Double;
CalcSum, CalcMult: ICalculator;
begin
a := 10;
b := 20;
CalcSum := TSum.Create;
rSum := CalcSum.ExecuteCalc(a, b); //resultado da
soma
rMult := CalcMult.ExecuteCalc(a, b); //resultado
da multiplicação
end;
type
portal.rmfactory.com.br
17 Introdução a Orientação a Objetos com Delphi
ICarro = interface
procedure SetModelo(const Value: string);
function GetModelo: string;
procedure Ligar;
property Modelo: string read GetModelo write
SetModelo;
end;
Implementation
uses
Dialogs;
constructor TMercedez.Create;
begin
inherited;
FModelo := 'Mercedez';
end;
portal.rmfactory.com.br
18 Introdução a Orientação a Objetos com Delphi
procedure TMercedez.Ligar;
begin
ShowMessage('Motor ligado!');
end;
IMPLEMENTS
portal.rmfactory.com.br
19 Introdução a Orientação a Objetos com Delphi
IInterfaceA = interface
procedure Sample;
end;
POLIMORFISMO
portal.rmfactory.com.br
20 Introdução a Orientação a Objetos com Delphi
THuman = class(TAnimal)
procedure Walk; override;
end;
TDog = class(TAnimal)
procedure Walk; override;
end;
portal.rmfactory.com.br
21 Introdução a Orientação a Objetos com Delphi
DoWalk(Tdog.Create);
portal.rmfactory.com.br
22 Introdução a Orientação a Objetos com Delphi
TFirstClass = class
procedure Sample; virtual;
end;
TSecondClass = class(TFirstClass)
procedure Sample; override;
end;
TThirdClass = class(TSecondClass)
procedure Sample; override;
end;
TFourthClass = class(TThirdClass)
procedure Sample; override;
end;
implementation
uses
Dialogs;
portal.rmfactory.com.br
23 Introdução a Orientação a Objetos com Delphi
procedure TSecondClass.Sample;
begin
ShowMessage('Second!');
end;
procedure TThirdClass.Sample;
begin
ShowMessage('Third!');
end;
procedure TFourthClass.Sample;
begin
ShowMessage('Fourth!');
end;
procedure TFirstClass.Sample;
begin
ShowMessage('First!');
end;
TSecondClass = class(TFirstClass)
procedure Sample; override;
end;
TThirdClass = class(TSecondClass)
procedure Sample; override;
end;
portal.rmfactory.com.br
24 Introdução a Orientação a Objetos com Delphi
TFourthClass = class(TThirdClass)
procedure Sample; virtual;
end;
Resultado: “Third!”
portal.rmfactory.com.br
25 Introdução a Orientação a Objetos com Delphi
SOBRECARGA DE MÉTODOS
Uma das regras na declaração de classes é que não
podem haver dois ou mais métodos com o mesmo nome,
ainda que com parâmetros diferentes.
type
TSample = class
procedure Calc(Value: integer);
function Calc(a,b: integer): integer; //erro
aqui!!
end;
implementation
uses
Dialogs, SysUtils;
portal.rmfactory.com.br
26 Introdução a Orientação a Objetos com Delphi
type
TSample = class
procedure Calc(Value: integer); overload;
function Calc(a,b: integer):integer; overload;
end;
TSample1 = class(TSample)
procedure Test(s: string);overload;
end;
portal.rmfactory.com.br
27 Introdução a Orientação a Objetos com Delphi
MÉTODOS ABSTRATOS
portal.rmfactory.com.br
28 Introdução a Orientação a Objetos com Delphi
TYPE CASTS
Type Cast é um mecanismo do Delphi Language que
permite a conversão pontual de um determinado tipo. Em
conjunto com polimorfismo, type casts tornam-se
indispensáveis na codificação de rotinas genéricas.
TDog = class(TAnimal)
Pedigree: string;
end;
portal.rmfactory.com.br
29 Introdução a Orientação a Objetos com Delphi
TCat = class(TAnimal)
Name: string;
end;
var
Animal: TAnimal;
begin
Animal := TCat.Create;
TCat(Animal).Name := 'Lissi'; //type cast
end;
ENCAPSULAMENTO
portal.rmfactory.com.br
30 Introdução a Orientação a Objetos com Delphi
portal.rmfactory.com.br
31 Introdução a Orientação a Objetos com Delphi
GET E SETS
Uma vez que as propriedades promovem uma forma de
encapsulamento e controle de leitura e escrita, podemos
substituir a leitura e escrita direto do campo por métodos Get
e Set.
Property Nome: string read GetNome write SetNome;
portal.rmfactory.com.br
32 Introdução a Orientação a Objetos com Delphi
O OPERADOR INDEX
Os métodos Get e Set são instrumentos eficientes no
controle da leitura e escrita por parte de uma propriedade,
mas pode ser tornar um elemento perturbador no que diz
respeito a legibilidade de uma classe, por isso, é possível
compartilhar um único par de métodos Get e Set entre diversas
propriedades indexadas. Para declarar esta funcionalidade
adicione a diretiva “index” seguido de um inteiro entre -
2147483647 e 2147483647 em todas as propriedades que irão
usar os métodos compartilhados:
Type
TAluno = class
private
FNome: string;
FEmail: string;
FTelefone: string;
function GetData(const Index: Integer): string;
procedure SetData(const Index: Integer; const
Value: string);
public
property Nome: string index 0 read GetData write
SetData;
property Email: string index 1 read GetData write
SetData;
property Telefone: string index 2 read GetData
write SetData;
end;
implementation
portal.rmfactory.com.br
33 Introdução a Orientação a Objetos com Delphi
2: result := FTelefone;
end;
end;
PROPRIEDADES INDEXADAS
Propriedades podem ser declaradas de forma a permitir
a leitura seqüencial de uma estrutura ordinal como um array.
A declaração é bem simples, basta informa a lista de
parâmetros ao lado do nome da propriedade:
interface
uses
Classes;
type
TCliente = class
private
FTelsList: TStringList;
function GetTelefones(Index: integer): string;
procedure SetTelefones(Index: integer; const
portal.rmfactory.com.br
34 Introdução a Orientação a Objetos com Delphi
Value: string);
public
constructor Create; destructor Destroy; override;
property Telefones[Index: integer]: string read
GetTelefones write SetTelefones;
end;
implementation
uses
SysUtils;
constructor TCliente.Create;
begin
inherited;
FTelsList := TStringList.Create;
end;
destructor TCliente.Destroy;
begin
FreeAndNil(FTelsList);
inherited;
end;
portal.rmfactory.com.br
35 Introdução a Orientação a Objetos com Delphi
var
Cliente: TCliente;
begin
Cliente := TCliente.Create;
Cliente.Telefones[0] := '21 2223-1234';
end;
var
Cliente: TCliente;
begin
Cliente := TCliente.Create;
Cliente[0] := '21 2223-1234';
end;
portal.rmfactory.com.br
36 Introdução a Orientação a Objetos com Delphi
O
DAO – Data Access Object é um pattern J2EE
que objetiva criar uma camada abstrata e
encapsulada a qual o modelo pudesse utilizar
para persistir seus objetos, com isto, resolver a impedância que
existe entre os objetos e o banco de dados relacional. Ainda
que trabalhamos orientados a objetos, o banco de dados é
relacional, com isto, ainda há a necessidade de se trabalhar
com comandos SQL. O DAO gerenciará a conexão ao banco
de dados, fará o controle das gravações e obtenções de
dados.
portal.rmfactory.com.br
37 Introdução a Orientação a Objetos com Delphi
ESTRUTURA DAO
BUSINESSOBJECT
Representa os objetos do modelo, que requisitam acesso
à fonte de dados para obter e armazenar dados.
DATAACCESSOBJECT
É o objeto primário deste padrão, faz o acesso aos dados
transparente para uso dos BusinessObject’s.
portal.rmfactory.com.br
38 Introdução a Orientação a Objetos com Delphi
DATASOURCE
Representa uma implementação de uma fonte de
dados, seja ela um RDBMS, OODBMS, XML etc..
TRANSFEROBJECT
Representa um “Transfer Object” usado para conexões
remotas.
type
TCliente = class
private
FEmail: string;
FNome: string;
FOID: integer;
procedure SetEmail(const Value: string);
procedure SetNome(const Value: string);
procedure SetOID(const Value: integer);
published
property OID: integer read FOID write SetOID;
property Nome: string read FNome write SetNome;
property Email: string read FEmail write SetEmail;
end;
IClienteDAO = interface
function Apply(Cliente: TCliente): boolean;
function Delete(Cliente: TCliente): boolean;
function List: TList;
function Find: TCliente;
end;
TClienteDAOMSSQL = class(TInterfacedObject,
IClienteDAO)
function Apply(Cliente: TCliente): boolean;
function Delete(Cliente: TCliente): boolean;
function List: TList;
portal.rmfactory.com.br
39 Introdução a Orientação a Objetos com Delphi
Implementation
portal.rmfactory.com.br
40 Introdução a Orientação a Objetos com Delphi
portal.rmfactory.com.br
41 Introdução a Orientação a Objetos com Delphi
begin
result := TCliente.Create;
result.Nome :=
Data.FieldByName('Nome').AsString;
result.Email:=
Data.FieldByName('Email').AsString;
end;
finally
freeAndNil(Conn);
freeAndNil(Data);
end;
end;
portal.rmfactory.com.br
42 Introdução a Orientação a Objetos com Delphi
finally
freeAndNil(Conn);
freeAndNil(Data);
end;
end;
portal.rmfactory.com.br
43 Introdução a Orientação a Objetos com Delphi
var
FactoryDAO: TFactoryDAO;
ClienteDAO: IClienteDAO;
Cliente: TCliente;
begin
FactoryDAO :=
TFactoryDAOMSSQL.GetDaoFactory(dsMSSQL);
ClienteDAO := FactoryDAO.ClienteDAO;
Cliente := TCliente.Create;
Cliente.Nome := 'Rodrigo Mourão';
Cliente.Email :=
'rodrigomourao@rodrigomourao.com.br';
ClienteDAO.Apply(Cliente);
end;
CONCLUSÃO
Espero que estas poucas páginas tenham acrescentado
a você uma boa dose de conhecimento. Caso queira avançar
nos estudos da programação orientada a objetos com delphi,
não deixe de acessar meu curso gratuito de introdução a POO.
youtube.com/portalrmfactory
facebook.com/portalrmfactory
instagram.com/rodrigomouraocoach
portal.rmfactory.com.br