Métodos Abstratos em POO em PHP
Classes abstratas também podem conter métodos abstratos. Tais métodos não devem ter implementação, mas são necessários para indicar que tais métodos devem estar presentes nas classes filhas. E a implementação desses métodos já é uma tarefa para as classes filhas.
Para declarar um método como abstrato,
ao declará-lo, deve-se escrever a palavra-chave
abstract.
Vamos experimentar na prática. Suponha que se espere
que todas as classes filhas da classe User
tenham o método increaseRevenue.
Este método deve pegar a receita atual do usuário e aumentá-la em um determinado valor, passado como parâmetro.
A própria classe User não sabe qual
receita exatamente a classe filha receberá - pois para um funcionário
é um salário, enquanto para um estudante é uma bolsa. Portanto,
cada classe filha implementará este método
à sua própria maneira.
A essência aqui é que o método abstrato da classe
User força o programador a implementar
este método nas classes filhas, caso contrário o PHP retornará um erro.
Dessa forma, você, ou outro programador,
trabalhando com seu código,
não conseguirá de forma alguma
esquecer de implementar o método necessário
na classe filha.
Então, vamos experimentar na prática. Vamos adicionar
um método abstrato increaseRevenue
à classe User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Método abstrato sem corpo:
abstract public function increaseRevenue($value);
}
?>
Suponha que nossa classe Employee permaneça
sem alterações por enquanto. Neste caso, mesmo sem
criar um objeto da classe Employee,
mas simplesmente executar o código onde nossas
classes são definidas - o PHP retornará um erro.
Agora vamos escrever a implementação do método
increaseRevenue na classe
Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Vamos escrever a implementação do método:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Vamos verificar o funcionamento da nossa classe:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Vamos implementar o método increaseRevenue
também na classe Student. Só que agora o nosso
método aumentará a bolsa:
<?php
class Student extends User
{
private $scholarship; // bolsa
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// O método aumenta a bolsa:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Adicione à sua classe User o mesmo
método abstrato increaseRevenue.
Escreva a implementação deste método nas classes
Employee e Student.
Na classe Figure, torne abstratos os
métodos para obter a área e o perímetro da figura.