Programação
Orientada a Objeto - Parte III
Um exemplo prático em Delphi
Exemplo de POO na Linguagem Delphi (cont.)
Vá para a UClasses e abaixo da declaração da classe TPessoa crie duas classes descendentes da mesma como mostrado no código:
|
01 |
type |
|
02 |
TPessoa = class |
|
03 |
Nome: string; |
|
04 |
Fone: string; |
|
05 |
procedure Avaliar; |
|
06 |
constructor Create; |
|
07 |
destructor Destroy; |
|
08 |
end; |
|
09 |
|
|
10 |
TAluno = class(TPessoa) |
|
11 |
Turma: string; |
|
12 |
procedure Avaliar; |
|
13 |
constructor Create; |
|
14 |
destructor Destroy; |
|
15 |
end; |
|
16 |
|
|
17 |
TProf = class(TPessoa) |
|
18 |
Disciplina: string; |
|
19 |
procedure Avaliar; |
|
20 |
constructor Create; |
|
21 |
destructor Destroy; |
|
22 |
end; |
Nesse momento aplicamos o conceito de Herança, um vez que as classes TAluno e TProf são descendentes da classe TPessoa. Em seguida use o Ctrl+Shift+C nas classes e entre com o código em negrito:
|
01 |
implementation |
|
02 |
|
|
03 |
uses
Dialogs; |
|
04 |
|
|
05 |
{
TPessoa } |
|
06 |
|
|
07 |
procedure
TPessoa.Avaliar; |
|
08 |
begin |
|
09 |
ShowMessage('Avaliação sendo executada'); |
|
10 |
end; |
|
11 |
|
|
12 |
constructor
TPessoa.Create; |
|
13 |
begin |
|
14 |
Self.Nome := 'Novo Nome'; |
|
15 |
Self.Fone := 'Novo Fone'; |
|
16 |
end; |
|
17 |
|
|
18 |
destructor
TPessoa.Destroy; |
|
19 |
begin |
|
20 |
Self.Nome := ''; |
|
21 |
Self.Fone := ''; |
|
22 |
end; |
|
23 |
|
|
24 |
{
TAluno } |
|
25 |
|
|
26 |
procedure
TAluno.Avaliar; |
|
27 |
begin |
|
28 |
ShowMessage('Respondendo a prova'); |
|
29 |
end; |
|
30 |
|
|
31 |
constructor
TAluno.Create; |
|
32 |
begin |
|
33 |
Self.Nome := 'Novo Aluno'; |
|
34 |
Self.Turma := 'Nova Turma'; |
|
35 |
end; |
|
36 |
|
|
37 |
destructor
TAluno.Destroy; |
|
38 |
begin |
|
39 |
Self.Turma := ''; |
|
40 |
end; |
|
41 |
|
|
42 |
{
TProf } |
|
43 |
|
|
44 |
procedure
TProf.Avaliar; |
|
45 |
begin |
|
46 |
ShowMessage('Aplicando a prova'); |
|
47 |
end; |
|
48 |
|
|
49 |
constructor
TProf.Create; |
|
50 |
begin |
|
51 |
Self.Disciplina := 'Nova Disciplina'; |
|
52 |
end; |
|
53 |
|
|
54 |
destructor
TProf.Destroy; |
|
55 |
begin |
|
56 |
Self.Disciplina := ''; |
|
57 |
end; |
|
58 |
|
|
59 |
end. |
Novamente volte para o FPrincipal, mude o evento OnClick do TButton, compile e teste:
|
01 |
procedure TFPrincipal.Button1Click(Sender: TObject); |
|
02 |
var |
|
03 |
Pessoa: TPessoa; |
|
04 |
Aluno: TAluno; |
|
05 |
Prof: TProf; |
|
06 |
begin |
|
07 |
// Trabalhando com o objeto Pessoa |
|
08 |
Pessoa := TPessoa.Create; |
|
09 |
ShowMessage( 'Objeto Pessoa' +#13+ |
|
10 |
Pessoa.Nome +#13+ Pessoa.Fone ); |
|
11 |
Pessoa.Nome := 'Tadeu'; |
|
12 |
Pessoa.Fone := '1111-1111'; |
|
13 |
Pessoa.Avaliar; |
|
14 |
ShowMessage( 'Objeto Pessoa' +#13+ |
|
15 |
Pessoa.Nome +#13+ Pessoa.Fone ); |
|
16 |
Pessoa.Destroy; |
|
17 |
|
|
18 |
// Trabalhando com o objeto Aluno |
|
19 |
Aluno := TAluno.Create; |
|
20 |
ShowMessage( 'Objeto Aluno' +#13+ |
|
21 |
Aluno.Nome +#13+ Aluno.Fone +#13+
Aluno.Turma ); |
|
22 |
Aluno.Nome := 'José'; |
|
23 |
Aluno.Fone := '2222-2222'; |
|
24 |
Aluno.Turma := 'Comp02'; |
|
25 |
Aluno.Avaliar; |
|
26 |
ShowMessage( 'Objeto Aluno' +#13+ |
|
27 |
Aluno.Nome +#13+ Aluno.Fone +#13+
Aluno.Turma ); |
|
28 |
Aluno.Destroy; |
|
29 |
|
|
30 |
// Trabalhando com o objeto Prof |
|
31 |
Prof := TProf.Create; |
|
32 |
ShowMessage( 'Objeto Prof' +#13+ |
|
33 |
Prof.Nome +#13+ Prof.Fone +#13+
Prof.Disciplina ); |
|
34 |
Prof.Nome := 'Maria'; |
|
35 |
Prof.Fone := '3333-3333'; |
|
36 |
Prof.Disciplina := 'Linguagem II'; |
|
37 |
Prof.Avaliar; |
|
38 |
ShowMessage( 'Objeto Prof' +#13+ |
|
39 |
Prof.Nome +#13+ Prof.Fone +#13+
Prof.Disciplina ); |
|
40 |
Prof.Destroy; |
|
41 |
end; |
Note que mesmo sem termos declarado os campos Nome e Fone nas subclasses, elas herdaram esses campos da superclasse, dessa maneira a cada novo nível criada mais específico vai ficando a subclasse. O mesmo acontece com métodos que são declarados na superclasse e não o são na subclasse, mas no nosso exemplo redefinimos os métodos da superclasse, aplicando assim o conceito de Polimorfismo. A Linguagem Delphi garante o funcionamento correto do método desejado através do uso das palavras reservadas mostrada a tabela.
|
Palavra reservada |
Uso |
|
static |
Os métodos estáticos usam a implementação feita na subclasse que instância o objeto. Por default todo método é estático. |
|
virtual |
Embora os métodos virtuais usem a implementação feita na subclasse que instância o objeto, também podem ativar a implementação da superclasse. |
|
dynamic |
Semelhante ao anterior, o que os diferencia é que no caso anterior a velocidade de acesso é otimizada, enquanto no dynamic a otimização é feita em cima do código. Vale ressaltar que a diretiva virtual é a forma mais comum e eficiente de implementar o polimorfismo. |
|
override |
Essa diretiva garante que apenas uma implementação exista na classe descendente, ocultando as implementações das classes ancestrais. A assinatura do método deve ser igual em todas as classes descendentes e ancestrais, isso quer dizer que os métodos devem ter o mesmo nome e os seus parâmetros devem ter o mesmo número, tipo e ordem. Essa diretiva só pode ser usada com os métodos virtuais e dinâmicos. |
|
overload |
Essa diretiva permite que os métodos tenham assinaturas diferentes e não oculta as implementações das classes ancestrais, podendo ser usada com qualquer método – estático, virtual ou dinâmico. |
|
reintroduce |
Assim como a anterior permite que os métodos tenham assinaturas diferentes, mas nesse caso os métodos ancestrais são ocultados. Essa diretiva só pode ser usada com os métodos virtuais. |
|
abstract |
Essa diretiva é usada para determinar que o método não será implementado na classe onde foi declarada. Sua implementação deverá ser feita nas classes descendentes. Quando definimos um método como abstrato devemos ter em mente que a classe passa também a ser abstrata, não pode ser instanciada. Essa diretiva só pode ser usada em métodos virtuais e dinâmicos. |
|
final |
O uso dessa diretiva impede que classes descendentes redefinam métodos ancestrais. |
|
inherited |
Essa diretiva é usada para fazer uma chamada ao método ancestral e reaproveitar sua funcionalidade. |
Tabela 1 – Palavras reservadas para uso com métodos ancestrais e descendentes.
|
Este artigo foi cedido por http://www.cassic.com.br/ |