Abstraktiset menetelmät OOP:ssa PHP:ssä
Abstraktit luokat voivat sisältää myös abstrakteja menetelmiä. Tällaisilla menetelmillä ei saa olla toteutusta, vaan ne on tarkoitettu osoittamaan, että jälkeläisillä tulee olla tällaisia menetelmiä. Itse asiassa näiden menetelmien toteuttaminen on jälkeläisten tehtävä.
Jotta menetelmä voidaan määritellä abstraktiksi,
siihen tulee kirjoittaa avainsana abstract
sen määrittelyn yhteydessä.
Kokeillaan käytännössä. Oletetaan, että
kaikkien luokan User jälkeläisten tulee
omata menetelmä increaseRevenue.
Tämän menetelmän tulee ottaa käyttäjän nykyiset tulot ja kasvattaa niitä tietyn parametrina annetun määrän verran.
Itse luokka User ei tiedä, mitä tuloja
jälkeläinen saa - työntekijällä on palkka,
kun taas opiskelijalla on stipendi. Siksi
jokainen jälkeläinen toteuttaa tämän menetelmän
omalla tavallaan.
Pointti on siinä, että luokan User
abstrakti menetelmä pakottaa ohjelmoijan toteuttamaan
tämän menetelmän jälkeläisissä, muuten PHP antaa virheen.
Näin sinä, tai toinen ohjelmoija,
joka työskentelee koodisi kanssa, ei voi millään tavalla
unohtaa toteuttaa tarvittavaa menetelmää
jälkeläisessä.
Kokeillaan siis käytännössä. Lisätään
abstrakti menetelmä increaseRevenue
luokkaan User:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Abstrakti menetelmä ilman runkoa:
abstract public function increaseRevenue($value);
}
?>
Olkoon luokkamme Employee toistaiseksi
muuttumaton. Tässä tapauksessa, vaikka ei
luotaisi luokan Employee oliota,
vaan vain suoritettaisiin koodi, jossa määritellään
luokkamme, - PHP antaa virheen.
Kirjoitetaan nyt menetelmän increaseRevenue toteutus
luokassa Employee:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Kirjoitetaan menetelmän toteutus:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Testataan luokkamme toimintaa:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Toteutetaan menetelmä increaseRevenue myös
luokassa Student. Nyt menetelmämme
kasvattaa stipendiä:
<?php
class Student extends User
{
private $scholarship; // stipendi
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// Menetelmä kasvattaa stipendiä:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Lisää luokkaasi User samanlainen
abstrakti menetelmä increaseRevenue.
Kirjoita tämän menetelmän toteutus luokkiin
Employee ja Student.
Tee luokassa Figure abstraktit
menetelmät kuvion pinta-alan ja kehän saamiseksi.