Keli interfeisai OOP PHP
PHP palaiko daugialypę interfeisų realizaciją – kiekviena klasė gali realizuoti bet kokį skaičių interfeisų. Tam interfeisų vardus reikia išvardyti per kablelį po raktažodžio implements.
Tai dar vienas interfeisų skirtumas nuo abstrakčių klasių – galima realizuoti daug interfeisų, bet paveldėti kelias abstrakčias klases negalima.
Išbandykime praktiškai. Tarkime, kad be interfeiso iFigure, turime ir interfeisą iTetragon.
Šio interfeiso metodus realizuos klasės Quadrate ir Rectangle,
kadangi jos turi 4 kraštines, bet ne klasė
Disk.
Tarkime, kad interfeisas iTetragon aprašo
getterius visoms keturioms keturkampio
kraštinėms:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Tarkime, kad turime ir interfeisą iFigure,
kurį jau sukūrėme anksčiau:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Padarykime, kad klasė Quadrate
realizuotų du interfeisus. Tam išvardinkime
abu interfeisus per kablelį po raktažodžio
implements:
<?php
class Quadrate implements iFigure, iTetragon
{
// čia bus realizacija
}
?>
Papildykime dabar mūsų klasę Quadrate,
kad ji realizuotų interfeisą iTetragon.
Aišku, kad mūsų kvadratas yra išsigimęs
keturkampio atvejis, nes kvadrato
visos kraštinės yra lygios. Todėl visi nauji metodai
grąžins tą patį – kvadrato plotį:
<?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;
}
}
?>
Akivaizdu, kad stačiakampyje jau ne visos
kraštinės yra vienodos, o tik priešingos.
Šiuo atveju nauji metodai šiek tiek
skirsis. O, pavyzdžiui, trapecijoje
apskritai visos 4 kraštinės bus skirtingos.
Tačiau nesvarbu, kokią figūrą nagrinėsime – svarbu, kad visos šios figūros turės aprašytus metodus (net jei kai kurios figūros yra išsigimusios) ir veiks vienodai.
Padarykite taip, kad klasė Rectangle
taip pat realizuotų du interfeisus: ir iFigure,
ir iTetragon.
Sukurkite interfeisą iCircle su metodais
getRadius ir getDiameter.
Padarykite taip, kad klasė Disk taip pat
realizuotų du interfeisus: ir iFigure,
ir iCircle.