Մի քանի ինտերֆեյսներ OOP-ում PHP-ում

PHP-ում բազմակի ժառանգում չկա - յուրաքանչյուր դաս կարող է ունենալ միայն մեկ ծնող: Սակայն, ինտերֆեյսների դեպքում գործը այլ է կարգավորվում. յուրաքանչյուր դաս կարող է իրականացնել ցանկացած քանակի ինտերֆեյսներ: Դրա համար անհրաժեշտ է թվարկել ինտերֆեյսների անունները ստորակետերով բաժանված՝ implements հիմնաբառից հետո:

Սա ինտերֆեյսների և վերացական դասերի միջև եղած ևս մեկ տարբերություն է. կարելի է իրականացնել բազմաթիվ ինտերֆեյսներ, բայց անհնար է ժառանգել մի քանի վերացական դասեր:

Եկեք փորձենք գործնականում: Ենթադրենք, բացի iFigure ինտերֆեյսից, մենք ունենք նաև iTetragon ինտերֆեյսը: Այս ինտերֆեյսի մեթոդները կիրականացնեն Quadrate և Rectangle դասերը, քանի որ դրանք ունեն 4 կողմ, բայց ոչ Disk դասը:

Ենթադրենք, որ iTetragon ինտերֆեյսը նկարագրում է բոլոր չորս կողմերի գետտերները քառանկյունու համար:

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

Ենթադրենք նաև, որ մենք ունենք iFigure ինտերֆեյսը, որը մենք արել էինք ավելի վաղ:

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

Եկեք անենք, որ Quadrate դասը իրականացնի երկու ինտերֆեյս: Դրա համար թվարկենք երկու ինտերֆեյսները ստորակետերով բաժանված՝ implements հիմնաբառից հետո:

Quadrate.php<?php
  class Quadrate implements iFigure, iTetragon
  {
    // այստեղ կլինի իրականացումը
  }
?>

Հիմա զարգացնենք մեր Quadrate դասը, որպեսզի այն իրականացնի iTetragon ինտերֆեյսը: Հասկանալի է, որ մեր քառակուսին դեգեներատիվ դեպք է քառանկյունու, քանի որ քառակուսու բոլոր կողմերը հավասար են: Ուստի բոլոր նոր մեթոդները կվերադարձնեն նույն բանը՝ քառակուսու լայնությունը:

Quadrate.php<?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;
    }
  }
?>

Ակնհայտ է, որ ուղղանկյունում արդեն ոչ բոլոր կողմերն են նույնը, այլ միայն հակադիրները: Այս դեպքում նոր մեթոդները մի փոքր կտարբերվեն: Դե, և ինչ-որ տրապեզի դեպքում ընդհանրապես բոլոր 4 կողմերը կլինեն տարբեր:

Սակայն, կարևոր չէ, թե ինչ պատկեր մենք կդիտարկենք - կարևորն այն է, որ այս բոլոր պատկերները կունենան նկարագրված մեթոդները (թող որոշ պատկերներ լինեն դեգեներատիվ) և կաշխատեն միատեսակ:

Задание 1

Անեք, որ Rectangle դասը նույնպես իրականացնի երկու ինտերֆեյս՝ هم iFigure, و iTetragon:

Задание 2

Ստեղծեք iCircle ինտերֆեյսը հետևյալ մեթոդներով. getRadius և getDiameter:

Задание 3

Անեք, որ Disk դասը նույնպես իրականացնի երկու ինտերֆեյս՝ هم iFigure, و iCircle: