Para conhecer as demais partes, clique aqui.
Ao final deste artigo, você será capaz de:
- Entender o conceito de Abstração
- Criar Classes Abstratas
- Criar Classes Finais
- Criar Métodos Abstratos
- Criar Métodos Finais
Abstração
Podemos considerar abstração uma forma de separar mentalmente, simplificar ou mesmo considerar isoladamente. Um sistema orientado a objetos não deve ser visto como uma única peça, devamos separá-lo em partes, concentrando nas peças mais importantes e ignorando os detalhes (em primeiro momento) para que possamos construir peças bem-definidas que possam ser reaproveitadas mais tarde, formando uma estrutura hierárquica.
Sempre que estiver desenvolvendo um sistema OO, você deve aplicar este conceito, abstraia ao máximo, concentre-se em separar o sistema em módulos.
Classes Abstratas e Métodos Abstratos
Seguindo o conceito de abstração que acabamos de expor, encontraremos classes que irão servir como classes estruturais ou seja, que estão na nossa hierarquia de classes para servirem de base para outras classes, mas que nunca serão instanciadas em objetos, somente suas filhas. Neste contexto, é interessante definir está classe como abstrata, de modo que ninguém consiga instancia-la.
A grosso modo, classe abstrata nada mais é do que um modelo comum, que deve ser seguido pelas classes filhas, nunca é instanciado em objeto ou seja, não existe isoladamente.
Métodos abstratos possuem uma definição semelhante, não podem ser implementados nas classes abstratas, deve ser definido somente a assinatura do método e deve obrigatoriamente, ser implementado na integra pela classe filha que o estender. Em suma, um método abstrato é definido em uma classe abstrata, mas deve conter somente sua assinatura, o "corpo" do método fica por conta das classes filhas.
Com exemplo fica ainda mais fácil de entender:
/*Definimos uma classe como abstrata
* utilizando a palavra reservada abstract
* antes da palavra class
*/
abstract class Animal
{
public $nome;
public $idade;
//O método construtor seta os dois atributos
function __construct($nome, $idade)
{
$this->nome = $nome;
$this->idade = $idade;
}
//O método descrição retorna o nome e a idade
public function Descricao()
{
return $this->nome . ", " . $this->idade . " anos de idade";
}
/*O método Falar deve
*ser implementado na classe filha
*perceba que ele não tem implementação
*/
abstract public function Falar();
}
Temos nessa classe todas as características comuns de um animal. Todo animal possui um nome e todo animal possui uma idade, todo animal fala (o cachorro faz Au Au, o gato faz Miau). Perceba que o método Falar não possui nada implementado, além disso, a definição do método é precedida pela palavra abstract, o que significa que o método deve ser implementado em TODAS as classes que estenderem a classe Animal.Estamos levando para o mundo OO uma definição que temos no mundo real, veja: Um cachorro, um gato, um cavalo são animais, cada um com suas características especificas, mas todos são animais, todos possuem nome, idade e falam. Não faria sentido criar o objeto Animal.
Se tentarmos instanciar a classe animal teríamos o seguinte erro:
Fatal error: cannot instantiate abstract class Animal in animal.class.php on line 5
Obviamente agora temos que criar uma subclasse de Animal, chamaremos de Cachorro.
Agora podemos instanciar a classe Cachorro sem problemas:
Da mesma forma que criamos a classe Cachorro, poderíamos criar a classe Gato, Cavalo, Pato, todas herdando da classe Animal.
Classes Finais
Classes finais podem ser definidas como classes que não podem ser estendidas ou seja, não pode ser uma superclasse.
Uma classe é definida como final quando colocamos a palavra reservada final antes da palavra class.
A classe cachorro definida aqui, não pode ser herdada por nenhuma outra classe.
Métodos finais
Assim como classes finais, um método final não pode ser estendido e obviamente não pode ser abstrato, pois métodos abstratos foram feitos para serem estendidos e declarados na classe filha.
Para declarar um método como final basta usar a palavra reservada final antes da palavra function.
Terminamos assim mais um módulo do curso.
No próximo artigo falaremos sobre o encapsulamento.
Utilize o espaço de comentários para tirar suas dúvidas.
// Herdamos a classe Animal
class Cachorro extends Animal
{
/* Somos obrigados a implementar
* o método falar
*/
public function Falar()
{
return "Au Au!";
}
/* Vamos também complementar
* o método Descricao
*/
public function Descricao()
{
return parent::Descricao() . ", eu sou um cachorro!";
}
}
Agora podemos instanciar a classe Cachorro sem problemas:
$animal = new Cachorro("Rex", 5);
echo $animal->Descricao();
echo $animal->Falar();
Da mesma forma que criamos a classe Cachorro, poderíamos criar a classe Gato, Cavalo, Pato, todas herdando da classe Animal.
Classes Finais
Classes finais podem ser definidas como classes que não podem ser estendidas ou seja, não pode ser uma superclasse.
Uma classe é definida como final quando colocamos a palavra reservada final antes da palavra class.
final class Cachorro
{
public $nome;
public $idade;
function __construct($nome, $idade)
{
$this->nome = $nome;
$this->idade = $idade;
}
public function Descricao()
{
return $this->nome . ", " . $this->idade . " anos de idade";
}
}
A classe cachorro definida aqui, não pode ser herdada por nenhuma outra classe.
Métodos finais
Assim como classes finais, um método final não pode ser estendido e obviamente não pode ser abstrato, pois métodos abstratos foram feitos para serem estendidos e declarados na classe filha.
Para declarar um método como final basta usar a palavra reservada final antes da palavra function.
Class Cachorro
{
public $nome;
public $idade;
/* Este método não pode
* se estendido (sobrescrito)
*/
final function Descricao()
{
return $this->nome . ", " . $this->idade . " anos de idade";
}
}
Terminamos assim mais um módulo do curso.
No próximo artigo falaremos sobre o encapsulamento.
Utilize o espaço de comentários para tirar suas dúvidas.
Esperando pelas outras partes! =)
ResponderExcluirJá saiu. :)
Excluir