PHP'de OOP'de Sınıftan Kalıtım ve Arayüz Uygulama
Bir sınıf, başka bir sınıftan kalıtım alabilir ve aynı zamanda bir arayüz uygulayabilir. Pratik bir örnekle inceleyelim.
Diyelim ki, adı, maaşı ve programcının bildiği
dillerin listesi olan bir Programmer sınıfı
yapmak istiyoruz.
Şu an sınıfımızın tanımı oldukça belirsiz:
evet, sınıfta ad, maaş, diller olacak -
ama sınıfımızda hangi metodlar olacak?
Sınıfımızı iProgrammer arayüzünü kullanarak
daha kesin bir şekilde tanımlayalım:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
Diyelim ki halihazırda uyguladığımız sınıflarda
araştırma yaptık ve zaten benzer bir Employee
sınıfımızın olduğunu gördük. Bu sınıf, Programmer
sınıfının tüm metodlarını uygulamıyor, ama bir kısmını
uyguluyor. İşte zaten mevcut olan sınıfımızın kodu:
<?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;
}
}
?>
Mantıklı olan, yeni Programmer sınıfımızın,
kendisi için gerekli metodların bir kısmını Employee
sınıfından kalıtım alması (geri kalan kısmını ise daha sonra
yeni sınıfın kendi içinde uygulayacağız):
<?php
class Programmer extends Employee
{
}
?>
Bu arada, Programmer sınıfının
iProgrammer arayüzünü uygulaması
gerektiğini biliyoruz:
<?php
class Programmer implements iProgrammer
{
}
?>
Şimdi Employee sınıfından kalıtım alma
ile iProgrammer arayüzünü uygulamayı
birleştirelim:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
Böylece, Programmer sınıfımız
Employee sınıfından __construct,
getName ve getSalary metodlarını
kalıtım alacak, addLang ve getLangs
metodlarını ise bizim uygulamamız gerekecek:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// uygulama
}
public function getLangs()
{
// uygulama
}
}
?>
iProgrammer arayüzü için metodların
sınıfa ait mi yoksa kalıtımla mı geldiği
önemli değil - önemli olan, tanımlanan tüm
metodların uygulanmış olması.
Benim Employee sınıfımın kodunu ve
iProgrammer arayüzünün kodunu kopyalayın.
Benim Programmer sınıfı taslağımı kopyalamayın -
benim koduma bakmadan bu sınıfı kendi başınıza uygulayın.