კლასის მემკვიდრეობა და ინტერფეისის რეალიზაცია OOP-ში 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
{
}
?>
ამასთან, ჩვენ ვიცით, რომ Pogrammer კლასმა
უნდა რეალიზაცია გაუწიოს ინტერფეისს
iProgrammer:
<?php
class Programmer implements iProgrammer
{
}
?>
მოდით, გავაერთიანოთ მემკვიდრეობა Employee კლასიდან
და ინტერფეისის iProgrammer რეალიზაცია:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
გამოვა, რომ ჩვენი Pogrammer კლასი
მემკვიდრეობით მიიღებს Employee კლასიდან მეთოდებს
__construct, getName და getSalary,
ხოლო მეთოდები addLang და getLangs
ჩვენ თვითონ უნდა რეალიზაცია გავუწიოთ:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// რეალიზაცია
}
public function getLangs()
{
// რეალიზაცია
}
}
?>
ინტერფეისს iProgrammer არ აინტერესებს,
კლასის ნაწილია მეთოდები თუ მემკვიდრეობით მიღებული -
მთავარია, რომ ყველა აღწერილი მეთოდი იყოს
რეალიზებული.
დააკოპირეთ ჩემი Employee კლასის კოდი
და ინტერფეისის iProgrammer კოდი. ნუ დააკოპირებთ
ჩემს Programmer კლასის ჩანაწერს -
ჩემს კოდს რომ არ ნახოთ, თავად რეალიზაცია გაუწიოთ ამ
კლასს.