Postagem

Aqui é onde faço postagens de coisas que acho interessante.

Abstração de classe

Postagem do dia 01/01/1970 na categoria Classes em PHP



PHP 5 introduz métodos e classes abstratos. Não é permitido criar uma instà¢ncia de uma classe que foi definida como abstrata e qualquer classe que contenha pelo menos um método abstrato deve também ser abstrata. Métodos definidos como abstratos simplesmente declaram a assinatura do método, eles não podem definir a implementação.

Quando uma classe herda uma classe abstrata, todos os métodos marcados como abstratos na declaração da classe pai devem ser definidos na classe filha; além disso, esses métodos devem ser definidos com a mesma (ou menos restrita) visibilidade. Por exemplo, se um método abstrato é definido como protected, a implementação da função deve ser definida ou como protected ou public, mas não private. Além disso, as assinaturas dos métodos devem coincidir, ou seja, as induções de tipos e o número de argumentos requeridos devem ser os mesmos. Isto também se aplica aos construtores a partir do PHP 5.4. Antes do 5.4 as assinaturas dos construtores poderiam ser diferentes

Fonte PHP.NET

Vamos criar uma classe abstrata com 6 metodos, onde somente 3 metodos deverão ser implementados pela classe filha


<?php
/**
 * Definindo classe abstrata
 */
abstract class Animal
{
	protected $_raca;
	protected $_cor;
	protected $_idade;
	
    // Forca a classe que estende Preco a definir esse metodo
    abstract function setaRaca( $raca );
    abstract function setaCor( $cor );
    abstract function setaIdade( $idade );

    // A classe que estende Preco mao eh obrigada a definir esse metodo
    public function exibeRaca()
    {
		print $this->_raca;
	}

    // A classe que estende Preco mao eh obrigada a definir esse metodo
    public function exibeCor()
    {
		print $this->_cor;
	}

    // A classe que estende Preco mao eh obrigada a definir esse metodo
    public function exibeIdade()
    {
		print $this->_idade;
	}    		
}


Agora vamos criar uma classe filha que irá extender a classe pai


<?php
/**
 * Definindo classe concreta
 */
class Cachorro extends Animal
{
	private $_nome;

	function __construct( $nome = null )
	{
		if( $nome != null )
			$this->_nome = $nome;
		else
			throw new Exception( "Deve-se informar o nome do cachorro" );
	}
	
    function setaRaca( $raca = null )
    {
		if( $raca != null )
			$this->_raca = $raca;
		else
			throw new Exception( "Deve-se informar a raca do cachorro" );
        return $this;
    }

    public function setaCor( $cor = null )
    {
		if( $cor != null )
			$this->_cor = $cor;
		else
			throw new Exception( "Deve-se informar a cor do cachorro" );
        return $this;
    }

    public function setaIdade( $idade = null )
    {
		if( $idade != null )
			$this->_idade = $idade;
		else
			throw new Exception( "Deve-se informar a idade do cachorro" );
        return $this;
    }    
   
    public function imprimir()
    {
        print $this->_nome . ' da raca ' . $this->_raca . ' tem ' .  $this->_idade . ' anos';
    }
}


Agora vamos ver como será a utilização dessa classe.


<?php
// Criando um cachorro e exibindo suas caracteristica
$objCachorro = new Cachorro( 'Princesa' );
$objCachorro->setaRaca( 'viralata' )->setaCor( 'Branco e preto' )->setaIdade( '2' )->imprimir();


O resultado a ser impresso na tela será: Princesa da raca viralata tem 2 anos
Agora se quisermos exibir somente a raà§a deste cachorro, deveremos fazer da seguinte forma.


<?php
// Exibindo somente a raca do cachorro
$objCachorro->exibeRaca();


O resultado a ser impresso na tela será: viralata
Observe que a classe Cachorro não implementou os metodos exibeRaca, exibeCor e exibeIdade.
Por outro lado ela foi obrigado a implementar os metodos: setaRaca, setaCor e setaIdade.



Deixe seus comentários abaixo: