PHPде ООПдо абстракттык методдор

Абстракттык класстар абстракттык методдорду да камтый алат. Мындай методдордун ишке ашырылышы болбошу керек, алар мураскорлордо кандай методдор болушу керек экенин көрсөтүү үчүн керек. Ал эми бул методдорду ишке ашыруу мураскорлордун милдети.

Методду абстракттык деп жарыялоо үчүн, анын жарыяланган жеринде abstract деген ачкыч сөзүн жазуу керек.

Келгиле, практикада сынап көрөлү. User класcынын бардык мураскорлору increaseRevenue методуна ээ болушу керек деп эсептейли.

Бул метод колдонуучунун учурдагы кирешесин алып, аны параметр аркылуу берүлгөн белгилүү бир суммага көбөйтүшү керек.

User класcынын өзү мурасчынын кандай киреше аларын билбейт - анткени кызматкер үчүн бул эмгек акы, ал эми студент үчүн - стипендия. Ошондуктан ар бир мураскор бул методду өзүнчө ишке ашырат.

Бул жердеги маани, User класcынын абстракттык методу программачыны бул методду мураскорлордо ишке ашырууга мажбурлайт, антпесе PHP ката берет. Ошентип сиз же сиздин код менен иштеген башка программачы керектүү методду мурасчыда ишке ашырууну эч качан унутуп кала албайсыз.

Ошентип, келгиле практикада сынап көрөлү. User класcына increaseRevenue абстракттык методун кошолу:

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
    
    // Денесиз абстракттык метод:
    abstract public function increaseRevenue($value);
  }
?>

Employee класcыбыз өзгөрүлбөй калсын. Бул учурда, эгерде Employee класcынын объектисин түзбөсө да, жөн гана биздин класстар аныкталган коду иштетсек, - PHP ката берет.

Эми келгиле, Employee класcында increaseRevenue методунун ишке ашырылышын жазалы:

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // Методдун ишке ашырылышын жазабыз:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

Класcыбыздын иштешин текшеребиз:

index.php<?php
  $employee = new Employee;
  $employee->setName('john');
  $employee->setSalary(1000);
  $employee->increaseRevenue(100);
  
  echo $employee->getSalary();
?>

increaseRevenue методун Student класcында да ишке ашыралы. Бирок бул жолу биздин метод стипендияны көбөйтөт:

Student.php<?php
  class Student extends User
  {
    private $scholarship; // стипендия
    
    public function getScholarship()
    {
      return $this->scholarship;
    }
    
    public function setScholarship($scholarship)
    {
      $this->scholarship = $scholarship;
    }
    
    // Метод стипендияны көбөйтөт:
    public function increaseRevenue($value)
    {
      $this->scholarship = $this->scholarship + $value;
    }
  }
?>
Задание 1

User класcыңызга ушул сыяктуу абстракттык increaseRevenue методун кошуңуз. Бул методдун ишке ашырылышын Employee жана Student класстарында жазыңыз.

Задание 2

Figure класcында фигуранын аянтын жана периметрин алуу үчүн абстракттык методдорду жасаңыз.