Programao Orientada a Objetos Delphi Object Pascal Apresentando
Programação Orientada a Objetos Delphi (Object Pascal)
Apresentando Classes e Objetos: • Classes tipo de dados. – é um tipo de dados definidos pelo usuário, que tem um estado (sua representação) e algumas operações (seu comportamento). • Objetos entidades reais. – é uma instância de uma classe, em outras palavras, uma variável do tipo de dados definido pela classe. – quando o programa é executado, os objetos assumem alguma memória para sua representação interna. – o relacionamento entre objeto e classe é o mesmo existente entre variável e tipo.
Uma Classe possui: • Finalidade – os objetos pertencentes a uma classe sempre possuem um objetivo comum. • Hereditariedade – o Delphi possui mais de 500 classes de objeto, e toda nova classe deve ser herdeira de uma já existente. – a classe base, da qual derivam todas as outras classes (direta ou indiretamente) é TObject. – herdar significa que a nova classe (herdeira) pode utilizar todas as características da classe antecessora além de poder ter as suas próprias- relação de herança.
Uma Classe possui: • Propriedades (ou atributos) – semelhante as variáveis de memória, as propriedades armazenam dados sobre o objeto que afetam o seu funcionamento ou sua aparência. • Eventos – são também propriedades, mas armazenam o endereço de memória onde está uma procedure ou function. – estas procedures ou functions são executadas automaticamente quando algum tipo de ação ocorre com o objeto. • Métodos – são rotinas internas do objeto que nos prestam algum serviço, executando alguma tarefa.
Sintaxe para definição de Classes e Objetos em Object Pascal Subclasse Super. Classe type Nome. Da. Classe = class(Nome. Da. Classe. Pai) {definição das propriedades} {definição dos métodos} end; { Instância a classe, ou seja, declara o objeto } var Nome. Do. Objeto : Nome. Da. Classe; Instância
type TData = class private dia, mes, ano: word; function Ano. Bissexto(a: word): boolean; function Dias. No. Mes(m: word): integer; public constructor Create(d, m, a: word); overload; constructor Create; overload; procedure Incrementa(N: word = 1); procedure Decrementa(N: word = 1); function Imprime. Data: string; protected function Total. De. Dias: word; end; { Instância a classe, ou seja, declara o objeto } var dt. Hoje: TData;
Mensagens • Qualquer informação trocada entre o objeto e o usuário (e vice-versa). • Quando consultamos uma propriedade particular ou atribuímos a ela um valor, estamos trocando mensagem com o objeto. • Quando solicitamos que o objeto execute uma ação (ou, um método), também estamos trocando mensagem com ele.
Hierarquia das Classes no Delphi TObject é a “classe base” para todas as classes. TPersistent define as características básicas de todos os objetos que necessitam de alocação dinâmica de memória e que podem ser atribuídos uns aos outros. TComponent TControl define as características de todos os componentes que têm a capacidade de aparecer nas páginas de componentes e de serem manipulados em tempo de projeto. é a classe base para todos os componentes visuais. TGrafic. Control componentes que não têm a capacidade de receber foco. TWin. Control componentes que têm a habilidade de receber foco e de conter outros componentes dentro de si.
Demonstrando a hierarquia de classes TObject create, destroy, free TPersistent TComponent name, tag TControl caption, left, top TGraphic. Control TSpeed. Button TImage glyph picture, stretch TWin. Control TButton TBit. Btn glyph, kind, layout
Relação de Posse • Cada objeto na tela pertence a alguém (outro objeto). • Se estamos dentro de um método de um objeto, a propriedade Owner, nos permite acessar o objeto imediatamente anterior na relação de posse, o dono imediato. • Normalmente o dono de um objeto é o próprio formulário, enquanto o objeto sobre o qual um outro é colocado é chamado de Parent.
Owner: Form 1 Parent: Form 1 Owner: Form 1 Parent: Panel 1 Owner: Form 1 Parent: Group. Box 1
Relação de Posse • Todos os objetos derivados de TComponent possuem uma propriedade chamada Owner que indica quem é o “dono” do objeto. • Já os objetos visuais, derivados de TControl, possuem a propriedade Parent que armazena o objeto no qual eles estão contidos. • Apenas objetos derivados da classe TWin. Control podem armazenar outros objetos.
Propriedades TComponent • Component. Count: integer – retorna com a quantidade de componentes que pertencem a um determinado componente. • Component. Index: integer – posição de um componente. • Components[Index: integer]: TComponent – array contendo todos os componentes pertencentes a outro componente. • Name: TComponent. Name – nome do component. • Owner: TComponent – objeto ao qual pertence um determinado componente. – quando um objeto é liberado da memória, todos os objetos que pertencem a ele também são liberados. • Tag: Longint – variável de uso exclusivo do programador, não tendo nenhum significado para o Delphi.
Modelo de Referência (1/2) • O Object Pascal baseia-se no modelo de referência a objetos. • O que significa ? – Cada variável de um tipo de classe não contêm o valor do objeto. Em vez disso, ela contêm uma referência, ou um ponteiro, para indicar o local de memória onde o objeto foi armazenado (ligação dinâmica ou tardia). • Qual a consequência ? – As instâncias de objetos devem ser criadas manualmente.
Modelo de Referência (2/2) • Observação ! – As instâncias dos componentes incorporados aos formulários de uma aplicação são construídas automaticamente pelo Delphi. • Como criar instâncias ? – Chamar o método Create, que é um construtor (constructor) da classe TObject • Como descartar ? – Chamar o método Free, outro método da classe TObject
Dia Mes Ano. . . Objeto (uma referência) Área de Memória de Pilha Dados do Objeto Área de Memória de Armazenamento Temporário
Declarando um Construtor: • método Create – objetivo = alocar a memória p/ o objeto # inicializá-lo • constructor – objetivo = prover um construtor personalizado que cria o objeto e lhe dá um valor inicial – é um procedimento especial, quando aplicado a uma classe Delphi automaticamente aloca memória para um objeto daquela classe – preferencialmente o construtor deverá ter o nome Create – constructor Create(AOwner: TComponent); override;
A Classe TDate type TDate = class private f. Date: TDate. Time; function Get. Year: Integer; public constructor Create; overload; constructor Create (y, m, d: Integer); overload; . . . end; polimorfismo de sobrecarga implementation constructor TDate. Create(y, m, d: Integer); begin f. Date : = Encode. Date (y, m, d); end; constructor TDate. Create; begin f. Date : = Date; end;
Declarando um Destrutor: • método Destroy, ou Free – objetivo = destruir, ou desalocar, a memória do objeto – o método Free, chamará o Destroy somente se o objeto existir, isto é, se não for nil (nulo) • destructor – objetivo = prover um destrutor personalizado que limpa os recursos antes que um objeto seja destruído – os destrutores são necessários somente para objetos que adquirirem recursos em seus construtores ou durante seu tempo de vida – procedure Free; – destructor Destroy; virtual;
Usando a Classe TDate type TDate. Form = class(TForm). . . private { Campo privado da } The. Day: TDate; { classe do formulário } end; implementation { Cria uma instância (objeto) da classe TDate. } procedure TDate. Form. Create(Sender: TObject); begin The. Day : = TDate. Create(2000, 09, 12); end; { O objeto The. Day é destruído juntamente com o formulário. } procedure TDate. Form. Destroy(Sender: TObject); begin The. Day. Free; end;
A Palavra-chave Self (1/2) • Os métodos possuem um parâmetro implícito, que é uma referência ao objeto atual. • Dentro de um método é possível se referir ao objeto atual usando a palavra-chave self. • Esse parâmetro oculto extra é necessário quando existe a declaração de diversos objetos da mesma classe, de forma que cada vez que se aplica o método a um dos objetos, ele opera somente em seus próprios dados e não afeta os objetos irmãos.
A Palavra-chave Self (2/2) • Self do Delphi this do C++ e do Java • O que é importante saber ? – Que o Self é uma construção fundamental usada pelo compilador, mas às vezes é usada por programadores para resolver conflitos de nomes. – Que a implementação técnica de uma chamada a um método difere de uma chamada a uma subrotina genérica.
Herdando de Tipos Existentes • herança (ou subclasseamento ou derivação) • objetivo, acrescentar um novo método ou mudar um existente (polimorfismo de sobreposição)
Herança e Compatibilidade de Tipos • O Pascal é estritamente um linguagem tipada. Erro, Variável Inteira : = Valor Booleano. • Há uma exceção no caso dos tipos de Classes. – typecasting = tratar o objeto como um objeto diferente mais relacionado – Uma Classe Ancestral pode receber uma Classe Derivada (Sender: TObject). – Classe Ancestral : = Classe Derivada; // Isto é OK – Classe Derivada : = Classe Ancestral; // Isto é um Erro
Operador is • permite verificar dinamicamente o tipo real de um objeto através da sintaxe: objeto is classe procedure TForm 1. Button 1 Click(Sender: TObject); begin if Sender is TShape then (Sender as TShape). Color : = cl. Red else if Sender is TPanel then (Sender as TPanel). Color : = cl. Green; end;
Operador as • efetua o cast do objeto- typecasting, tratar o objeto como um objeto diferente mas relacionado: (objeto as classe) procedure TForm 1. Button 1 Click(Sender: TObject); begin if Sender is TButton then (Sender as TButton). Caption : = ‘Olá’; end; (Sender as TButton) faz o cast do objeto “Sender” para o tipo TButton, e permite que haja referência a qualquer uma das propriedades e/ou métodos da classe TButton através do operador normal de referenciação (o ponto).
Ligação Tardia e Polimorfismo • Ligação estática – compilador ou o ligador (linker), substitui a chamada a um método por uma chamada ao local de memória específico onde a função ou procedimento reside (endereço da função) • Ligação dinâmica ou tardia (Linguagens POO) – o endereço real do método a ser chamado é determinado em tempo de execução – polimorfismo, o método chamado depende do tipo de objeto que a variável se relaciona
Sobrepondo Métodos • Substituir o método da classe ancestral por uma nova versão • Acrescentar mais algum código ao método existente (inherited) procedure My. Sub. Class. One; begin // novo código. . . // chama o procedimento herdado My. Class. One inherited one; end;
Métodos Virtuais X Dinâmicos No Delphi existem duas maneiras diferentes de ativar a ligação tardia: • Métodos virtuais (virtual) – tabela de métodos virtuais (VMT- Virtual Method Table), execução rápida de chamadas a métodos • Métodos dinâmicos (dynamic) – número único indica o método
Métodos Abstratos • A palavra-chave abstract é usada para declarar métodos que serão definidos somente em subclasses da classe atual. • Justificativa, emprego do polimorfismo. • O que isto significa ? – Não é possível chamar métodos fornecidos por subclasses (através da classe ancestral), a não ser que a classe pai tenha pelo menos a declaração desse método em sua interface, na forma de um método abstract.
Encapsulamento e Formulários • idéia principal reduzir o n° de variáveis globais usadas por um programa • ocultação de informações se refere a alterações de encapsulamento • problemas com o uso de variáveis globais: – compartilhamento de dados (solução encapsular na classe do formulário) – modificando a implementação afeta o código que usa os dados
Herança Visual de Formulário • Objetivo – herdar formulário de outro já existente. • Vantagem – reutilizar formulários semelhantes. • Formulário progenitor (pai, TForm) – barra de ferramentas, logotipo, localização, . . .
Referência • Dominando o Delphi 4 - A Bíblia – Marco Cantú – MAKRON Books, 1999 – Capítulo 3 - Programação Orientada a Objetos em Delphi – pg. 67. . 109 • Impacta Tecnologia – www. impacta. com. br
- Slides: 34