PHP да ООП да синфдан мерос олиш ва интерфейсни амалга ошириш
Синф бошқа синфдан мерос олиши мумкин ва шу билан бирга кайсидир интерфейсни амалга ошириши мумкин. Амалий мисолда кўриб чиқайлик.
Фарз қилайлик, биз Programmer синфини яратишни истаймиз,
унда исм, маош ва дастурчи билган тиллар рўйхати
бўлади.
Ҳозирча бизнинг синф тавсифимиз жуда номаълум:
ҳа, синфда исм, маош, тиллар бўлади -
лекин бизнинг синфимизда қандай методлар бўлади?
Келинг, бизнинг синфимизни iProgrammer интерфейси
орқали аниқроқ тавсифлаймиз:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Фарз қилайлик, биз аллақачон амалга оширилган
синфларимизни текширдик ва, маълум бўлдики, бизда ўхшаш
Employee синфи мавжуд. У Programmer синфининг
ҳамма методларини эмас, бирок бир қисмини амалга оширади.
Бизда мавжуд бўлган синфнинг коди:
<?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;
}
}
?>
Бизнинг ҳолатимизда, Programmer синфимиз
Employee синфидан ўзига керак бўлган методларнинг бир қисмини мерос олиши
(қолган қисмини эса кейин янги синфнинг ўзида амалга оширамиз)
мақул кўринади:
<?php
class Programmer extends Employee
{
}
?>
Шу билан бирга, Programmer синфи
iProgrammer интерфейсини амалга ошириши кераклиги маълум:
<?php
class Programmer implements iProgrammer
{
}
?>
Келинг, Employee синфидан мерос олиш ва
iProgrammer интерфейсини амалга оширишни бирлаштирайлик:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Натижада, бизнинг Programmer синфимиз
Employee синфидан __construct, getName ва getSalary
методларини мерос олади,
addLang ва getLangs методларини эса
биз амалга оширишимиз керак бўлади:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// амалга ошириш
}
public function getLangs()
{
// амалга ошириш
}
}
?>
iProgrammer интерфейси учун методлар асосий синфда ёки мерос олинган бўлиши
муҳим эмас - асосийси, ҳамма тавсифланган методлар амалга оширилган бўлиши керак.
Менинг Employee синфим ва iProgrammer интерфейсимнинг кодидан нусха олинг.
Менинг Programmer синфим учун тайёрловкимдан нусха олмангиз -
менинг кодга қарамай, бу синфни ўзингиз амалга оширинг.