Absztrakt metódusok az OOP-ban PHP-ben
Az absztrakt osztályok tartalmazhatnak absztrakt metódusokat is. Az ilyen metódusoknak nem szabad implementációval rendelkezniük, hanem azért szolgálnak, hogy jelezzék, hogy az ilyen metódusoknak a leszármazottaknál is jelen kell lenniük. Maguknak az ilyen metódusok implementálása már a leszármazottak feladata.
Ahhoz, hogy egy metódust absztraktnak nyilvánítsunk,
a deklarációjakor a abstract kulcsszót
kell használni.
Próbáljuk ki a gyakorlatban. Tegyük fel, hogy
az összes User osztályból származó osztálynak
rendelkeznie kell egy increaseRevenue
metódussal.
Ennek a metódusnak a felhasználó jelenlegi jövedelmét kell vennie, és egy paraméterként átadott értékkel növelnie kell azt.
Maga a User osztály nem tudja, hogy a leszármazott
pontosan milyen jövedelemmel fog rendelkezni - hiszen egy
alkalmazott esetében ez a fizetés, egy diák esetében pedig
az ösztöndíj. Ezért minden leszármazott saját módon
fogja implementálni ezt a metódust.
A lényeg az, hogy a User osztály absztrakt metódusa
kényszeríti a programozót, hogy implementálja ezt a metódust
a leszármazottakban, különben a PHP hibát jelez.
Így te, vagy egy másik programozó, aki a kódoddal dolgozik,
esélye sem lesz elfelejteni a szükséges metódus
implementálását a leszármazottban.
Nos, próbáljuk ki a gyakorlatban. Adjuk hozzá
az increaseRevenue absztrakt metódust
a User osztályhoz:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
// Absztrakt metódus implementáció nélkül:
abstract public function increaseRevenue($value);
}
?>
Tegyük fel, hogy a Employee osztályunk
egyelőre változatlan marad. Ebben az esetben,
még ha nem is hozunk létre Employee
osztályú objektumot, hanem csak futtatjuk
az osztályainkat definiáló kódot, - a PHP
hibát fog jelezni.
Most írjuk meg a increaseRevenue
metódus implementációját a Employee
osztályban:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
// Írjuk meg a metódus implementációját:
public function increaseRevenue($value)
{
$this->salary = $this->salary + $value;
}
}
?>
Ellenőrizzük az osztályunk működését:
<?php
$employee = new Employee;
$employee->setName('john');
$employee->setSalary(1000);
$employee->increaseRevenue(100);
echo $employee->getSalary();
?>
Implementáljuk a increaseRevenue
metódust a Student osztályban is.
Csak most a metódusunk az ösztöndíjat
fogja növelni:
<?php
class Student extends User
{
private $scholarship; // ösztöndíj
public function getScholarship()
{
return $this->scholarship;
}
public function setScholarship($scholarship)
{
$this->scholarship = $scholarship;
}
// A metódus növeli az ösztöndíjat:
public function increaseRevenue($value)
{
$this->scholarship = $this->scholarship + $value;
}
}
?>
Adja hozzá a User osztályához ugyanezt
az absztrakt increaseRevenue metódust.
Írja meg ennek a metódusnak az implementációját
a Employee és Student osztályokban.
A Figure osztályban készítsen absztrakt
metódusokat az alakzat területének és kerületének
megkapásához.