⊗ppOpIfSII 73 of 107 menu

Více rozhraní v OOP v PHP

V PHP neexistuje vícenásobné dědění - každá třída může mít pouze jednoho rodiče. S rozhraními je to však jinak: každá třída může implementovat libovolný počet rozhraní. K tomu je třeba jména rozhraní uvedout čárkou oddělená za klíčovým slovem implements.

To je další rozdíl mezi rozhraními a abstraktními třídami - můžete implementovat hodně rozhraní, ale nelze zdědit více abstraktních tříd.

Pojďme to vyzkoušet v praxi. Předpokládejme, že kromě rozhraní iFigure máme také rozhraní iTetragon. Metody tohoto rozhraní budou implementovat třídy Quadrate a Rectangle, protože mají 4 strany, ale ne třída Disk.

Nechť rozhraní iTetragon popisuje gettery pro všechny čtyři strany čtyřúhelníku:

<?php interface iTetragon { public function getA(); public function getB(); public function getC(); public function getD(); } ?>

Předpokládejme také, že máme rozhraní iFigure, které jsme již dříve vytvořili:

<?php interface iFigure { public function getSquare(); public function getPerimeter(); } ?>

Udělejme tak, aby třída Quadrate implementovala dvě rozhraní. K tomu vypišme obě rozhraní čárkou oddělená za klíčovým slovem implements:

<?php class Quadrate implements iFigure, iTetragon { // zde bude implementace } ?>

Nyní upravme naši třídu Quadrate tak, aby implementovala rozhraní iTetragon. Je zřejmé, že náš čtverec je degenerovaným případem čtyřúhelníku, protože čtverec má všechny strany stejné. Proto všechny nové metody budou vracet to samé - šířku čtverce:

<?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; } } ?>

Je zřejmé, že v obdélníku již nejsou všechny strany stejné, ale pouze protilehlé. V tomto případě se nové metody budou mírně lišit. A v nějakém lichoběžníku budou obecně všechny 4 strany různé.

Nezáleží však na tom, jaký útvar budeme uvažovat - důležité je, že všechny tyto útvary budou mít popsané metody (i když některé útvary jsou degenerované) a pracovat jednotně.

Zařiďte, aby třída Rectangle také implementovala dvě rozhraní: iFigure a iTetragon.

Vytvořte rozhraní iCircle s metodami getRadius a getDiameter.

Zařiďte, aby třída Disk také implementovala dvě rozhraní: iFigure a iCircle.

Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout