Linguagem de Programação III Herança Prof. Moser Fagundes Curso Técnico em Informática (Modalidade Integrada) Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas
Vantagens da orientação a objetos A utilização da orientação a objetos e do encapsulamento do código em classes nos permite uma maior organização, mas um dos maiores benefícios que encontramos no paradigma orientado a objetos é o reuso. A possibilidade de reusar partes de código já programadas é o que nos dá agilidade no dia-a-dia, além de eliminar duplicações e reescritas de código.
O conceito de herança Quando falamos em herança, frequentemente pensamos em um tipo de árvore genealógica com avós, pais e filhos, e nas características transmitidas de uma geração para a próxima. Na orientação a objetos, devemos levar a herança como a passagem (compartilhamento) de características (atributos) e comportamentos (métodos) entre classes de uma mesma hierarquia (árvore). As classes inferiores na hierarquia automaticamente herdan todos os atributos e métodos das classes superiores, chamadas superclasses.
Vantagens da herança A herança tem aplicabilidade muito grande, visto que é muito comum termos de adicionar novas funcionalidade nos programas que estamos desenvolvendo: em vez de criarmos uma estrutura totalmente nova (uma nova classe), podemos reaproveitar uma estrutura (classe já existente) que nos forneça uma base provendo propriedades e comportamentos básicos.
Representando herança em UML Conta +agencia +numero +titular +saldo +retirar(quantia) +depositar(quantia) +obtersaldo() ContaCorrente +limite +retirar(quantia) ContaPoupanca +aniversario +retirar(quantia)
Herança no PHP class Conta { $agencia; $numero; $titular; $saldo; function retirar($_quantia) { // Código aqui function depositar($_quantia) { // Código aqui function obtersaldo() { // Código aqui
Herança no PHP class ContaCorrente extends Conta { $limite; function retirar($_quantia) { // Código aqui class ContaPoupanca extends Conta { $aniversario; function retirar($_quantia) { // Código aqui
Overriding (sobrescrita) Overriding ou sobrescrita é uma técnica utilizada para modificar o comportamento (método) de uma class-pai na classe-filha.... Conta +retirar(quantia) +depositar(quantia) +obtersaldo() ContaCorrente +limite +retirar(quantia) ContaPoupanca +aniversario +retirar(quantia)
Exemplo de overriding em PHP class Conta {... function retirar($_quantia) { $this->saldo -= $_quantia; class ContaCorrente extends Conta {... function retirar($_quantia) { if($_quantia >= ($this->saldo + $this->limite)) $this->saldo -= $_quantia; class ContaPoupanca extends Conta {... function retirar($_quantia) { if($_quantia >= $this->saldo) $this->saldo -= $_quantia;
Encapsulamento O encapsulamento, um dos recursos mais importantes da orientação a objetos, provê proteção de acesso aos atributos e métodos internos de um objeto. Visibilidade public protected private Descrição Membros declarados como public poderão ser acessados livremente a partir da própria classe, a partir das classes descendentes e a partir do programa que faz uso da classe. Membros declarados como protected poderão ser acessados a partir da própria classe e das classes descendentes, mas não podem ser acessados do programa que faz uso da classe. Membros declarados como private poderão ser acessados apenas da própria classe. Não podem ser acessados de classes descendentes, nem do programa que usa a classe.
Exemplo de encapsulamento public class Produto { public $codigo; class Livro extends Produto { public $titulo; function imprimir() { echo $this->codigo.'<br>'; echo $this->titulo.'<br>'; $livro0 = new Livro(); $livro0->codigo = 32343; Funciona sem problemas, pois $codigo é público.
Exemplo de encapsulamento protected class Produto { protected $codigo; class Livro extends Produto { protected $titulo; function imprimir() { echo $this->codigo.'<br>'; echo $this->titulo.'<br>'; $livro0 = new Livro(); $livro0->codigo = 32343; Acusa erro apenas fora da classe pois $codigo é protegido. Dentro da classe Produto funciona sem erros.
Exemplo de encapsulamento private class Produto { private $codigo; class Livro extends Produto { private $titulo; function imprimir() { echo $this->codigo.'<br>'; echo $this->titulo.'<br>'; $livro0 = new Livro(); $livro0->codigo = 32343; Acusa erro em ambos locais pois $codigo é privado. Atributos privados só podem ser acessados dentro da classe.
Chamando métodos na classe pai Para chamar métodos com o mesmo nome (overriding) na classe pai, devemos usar o modificador de escopo parent:: class Produto { private $codigo; function imprimir() { echo $this->codigo; class Livro extends Produto { private $titulo; function imprimir() { parent::imprimir(); echo $this->titulo; imprimir() está presente em ambas
Chamando métodos na classe pai class Produto { private $codigo; function construct($_codigo) { $this->codigo = $_codigo; class Livro extends Produto { private $titulo; function construct($_codigo,$_titulo) { parent:: construct($_codigo); $this->titulo = $_titulo; Ambas tem construtor