PHP'de OOP'de Birden Fazla Arayüz
PHP'de çoklu kalıtım yoktur - her
sınıfın yalnızca bir ebeveyni olabilir.
Ancak, arayüzler konusunda durum farklıdır:
her sınıf istediği sayıda arayüz
uygulayabilir. Bunun için, arayüz isimleri
implements anahtar kelimesinden sonra
virgülle ayrılarak listelenmelidir.
Bu, arayüzlerin soyut sınıflardan bir başka farkını ortaya koyar - birçok arayüz uygulanabilir, ancak birden fazla soyut sınıf miras alınamaz.
Pratikte deneyelim. Diyelim ki
iFigure arayüzünün yanı sıra,
iTetragon arayüzümüz de var.
Bu arayüzün metodları,
Quadrate ve Rectangle
sınıfları tarafından uygulanacak,
çünkü onların 4 kenarı var, ancak
Disk sınıfı tarafından uygulanmayacak.
Diyelim ki iTetragon arayüzü,
dörtgenin dört kenarının tamamı için
getter'ları tanımlıyor:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Ayrıca, daha önce yaptığımız
iFigure arayüzümüz de olsun:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Quadrate sınıfının iki arayüz
uygulamasını sağlayalım. Bunun için,
implements anahtar kelimesinden
sonra her iki arayüzü virgülle ayırarak
listeliyoruz:
<?php
class Quadrate implements iFigure, iTetragon
{
// burada uygulama olacak
}
?>
Şimdi Quadrate sınıfımızı,
iTetragon arayüzünü de
uygulayacak şekilde geliştirelim.
Karemizin, dejenere bir dörtgen
durumu olduğu açıktır, çünkü karenin
tüm kenarları eşittir. Bu nedenle tüm
yeni metodlar aynı şeyi döndürecek -
karenin genişliğini:
<?php
class Quadrate implements iFigure, iTetragon
{
private $a;
public function __construct($a)
{
$this->a = $a;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->a;
}
public function getC()
{
return $this->a;
}
public function getD()
{
return $this->a;
}
public function getSquare()
{
return $this->a * $this->a;
}
public function getPerimeter()
{
return 4 * $this->a;
}
}
?>
Açıktır ki, bir dikdörtgende artık
tüm kenarlar aynı değildir, sadece
karşıt kenarlar aynıdır.
Bu durumda, yeni metodlar biraz
farklılaşacaktır. Ve, örneğin bir yamukta
genellikle 4 kenarın tamamı farklı olacaktır.
Ancak, hangi şekli ele aldığımızın bir önemi yoktur - önemli olan, tüm bu şekillerin tanımlanan metodlara sahip olmasıdır (bazı şekiller dejenere olsa bile) ve benzer şekilde çalışmasıdır.
Rectangle sınıfının da iki arayüz
uygulamasını sağlayın: hem iFigure,
hem de iTetragon.
getRadius ve getDiameter metodlarına
sahip iCircle arayüzünü yapın.
Disk sınıfının da iki arayüz
uygulamasını sağlayın: hem iFigure,
hem de iCircle.