PHP-də OOP-də Sinifdən Miras və Interfeysin Realizasiyası
Sinif başqa bir sinifdən miras ala bilər və eyni zamanda hansısa interfeysi realizə edə bilər. Praktiki misalda nəzərdən keçirək.
Tutaq ki, biz Programmer sinifi yaratmaq istəyirik,
onun adı, maaşı və proqramçının bildiyi dillərin siyahısı olacaq.
Hələki sinifimizin təsviri olduqca qeyri-müəyyəndir:
bəli, sinifdə ad, maaş, dillər olacaq -
amma sinifimizdə hansı metodlar olacaq?
Gəlin sinifimizi iProgrammer interfeysi ilə
daha dəqiq təsvir edək:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Tutaq ki, biz artıq realizə etdiyimiz sinifləri
araşdırdıq və məlum oldu ki, artıq bizdə Employee
adlı oxşar sinif var. O, Programmer sinfinin
hamısını deyil, ancaq bir hissəsini realizə edir.
Bizdə artıq mövcud olan sinfin kodu belədir:
<?php
class Employee
{
private $name;
private $salary;
public function __construct($name, $salary)
{
$this->name = $name;
$this->salary = $salary;
}
public function getName()
{
return $this->name;
}
public function getSalary()
{
return $this->salary;
}
}
?>
Məntiqlidir ki, bizim vəziyyətimizdə
yeni Programmer sinifimizin, özünə lazım olan
metodların bir hissəsini Employee sinfindən
miras almasını təmin edək (qalan hissəsini isə sonra
artıq yeni sinifdə özümüz realizə edərik):
<?php
class Programmer extends Employee
{
}
?>
Eyni zamanda bizə məlumdur ki, Programmer sinfi
iProgrammer interfeysini realizə etməlidir:
<?php
class Programmer implements iProgrammer
{
}
?>
Gəlin Employee sinfindən miras almağı
və iProgrammer interfeysinin realizasiyasını
birləşdirək:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Belə çıxır ki, bizim Programmer sinfimiz
Employee sinfindən __construct, getName və getSalary
metodlarını miras alacaq,
addLang və getLangs metodlarını isə
biz realizə etməli olacıq:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// realizasiya
}
public function getLangs()
{
// realizasiya
}
}
?>
iProgrammer interfeysinə heç nə fərqi yoxdur,
metodlar sinfə öz və ya miras alınmışdır -
əsas odur ki, təsvir edilmiş bütün metodlar realizə olunsun.
Mənim Employee sinfimin kodunu
və iProgrammer interfeysinin kodunu köçürün.
Mənim Programmer sinfimin hazırlanmış kodunu köçürməyin -
mənim koduma baxmadan bu sinifi özünüz realizə edin.