✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Дивлячись на поліморфізм у глибині

13

Коли я починав цю серію, я говорив про чотири стовпи об’єктно-орієнтованого програмування. Кожна з цих тем перерахована нижче та за посиланням.

  1. Абстракція
  2. Інкапсуляція
  3. Спадщина
  4. Поліморфізм

На цьому етапі я зазвичай хотів би почати перехід до наступної теми. Перш ніж це зробити, я хотів би ще одну публікацію дослідити концепцію поліморфізму.

У моїй кар’єрі досі я бачив кілька тем, які викликали у тих, хто починає займатися об’єктно-орієнтованим програмуванням, більше плутанини та проблем, ніж поліморфізм. Тож я хотів би обговорити це трохи глибше в контексті об’єктно-орієнтованого програмування та поза будь-якою конкретною структурою чи програмою (наприклад, WordPress).

У цій публікації я зроблю короткий огляд того, що ми обговорювали досі, а потім повернуся до поліморфізму.

Глибина поліморфізму

По-перше, як уже згадувалося, я хочу швидко переглянути те, що обговорювалося досі, особливо якщо ви замовчили будь-яку з попередніх публікацій.

Не хвилюйтеся: наведене нижче не відволікається на код. Натомість він просто визначає терміни, які ми використовували, щоб ви мали певне уявлення про те, що я маю на увазі, коли бачите це слово, яке виникає в цій серії.

Абстракція

Ми абстрагуємо ідею чогось у клас. Замість цього ми будемо абстрагувати ідеї в їхніх класах. І тут є ключова ідея: клас має представляти іменник.

Інкапсуляція

Інкапсуляція – це насправді просто «велике» слово, яке стосується ідеї управління його обов’язками (або відстеження його даних).

Спадщина

Спадкування відноситься до ідеї, що один клас, хоча він має власну реалізацію, буквально успадковує властивості, функції та загальну реалізацію від батьківського класу.

Поліморфізм

Поліморфізм дозволяє посилатися на клас одного типу, коли він може бути оголошений як інший тип.

З огляду на це, я думаю, тут все може стати трохи складнішим. У попередніх публікаціях я надав кілька різних прикладів коду (і я закликаю вас переглянути їх).

Але в сьогоднішньому дописі я спробую вивчити цю ідею трохи далі як у поясненні, так і в коді.

Що стосується спадщини

Якщо на даний момент це не очевидно, поліморфізм тісно пов’язаний зі спадковістю. Подумайте про це так: якщо один клас успадковує властивості та методи від іншого класу, то він може «стояти на місці» батьківського класу.

Це означає, що якщо у вас є щось на кшталт  класу Content, а потім у вас є два підкласи, один з яких є Post, а інший – Page, ви можете створити екземпляр класу за допомогою типу посилання Content.t

Але під час виконання це фактично буде екземпляр типу Post. Мати сенс? Ось деякий код як приклад.

Спочатку ми почнемо з визначення класу вмісту :

<?php
class Content {

   protected $title;

   protected $content;

   protected $metadata;

   public function __construct()
   {
     $this->title = "Hello World!";
     $this->content = "This is a sample piece of content.";
     $this->metadata = "<This is the metadata of the post.>";
   }

   public function getTitle()
   {
     return $this->title;
   }

   public function getContent()
   {
     return $this->content;
   }

   public function getMetadata()
   {
     return $this->metadata;
   }
 }

Він має загальні властивості, які ви, ймовірно, звикли очікувати – заголовок, вміст і метадані. Звичайно, ці властивості є лише рядками, але вони можуть бути більш складними структурами даних у реальній ситуації.

Тепер давайте подивимося на пост :

<?php

class Post extends Content  {

   private $author;

   public function __construct() {
     parent::__construct();
     $this->author = "Tom McFarlin";
   }

   public function getAuthor()
   {
     return $this->author;
   }
 }

Що станеться тоді, якщо ви викликаєте метод  класу Post, наприклад getTitle, якого не існує, але він існує в  класі Content? Тоді через успадкування він шукатиме метод у Post, а не знаходитиме його, а потім почне шукати його у Content.

Якщо його знайдено, він запустить його.

Дивлячись на поліморфізм у глибині

Так само ми можемо зробити щось подібне з  класом сторінки та даними вмісту. Спочатку ми створюємо екземпляр базового класу, а потім встановлюємо властивості, специфічні для Page. У цьому випадку це буде категорія.

<?php

class Page extends Content  {

   private $category;

   public function __construct() {
     parent::__construct();
     $this->category = "Articles";
   }

   public function getCategory()
   {
     return $this->category;
   }
 }

Тепер, коли ми запускаємо код, ми можемо почати з вмісту:

<?php

$content = new Content();
echo $content->getTitle();

Зверніть увагу, що це виглядає так, як ми очікували, оскільки у нас є назва та вміст. Давайте також подивимося на пост :

<?php

// These will work because they reside in the Content base class.
$post = new Post();
echo $post->getAuthor();
echo $post->getTitle();

Це працює, тому що у нас є автор, але ми також маємо назву, оскільки вона міститься у Content. Але якщо ми спробуємо викликати getAuthor на екземплярі Post?

<?php

// These will work because they reside in the Content base class.
$post = new Post();
echo $post->getAuthor();
echo $post->getTitle();

Ми отримаємо помилку, оскільки метод не знаходиться в цьому класі.

Дивлячись на поліморфізм у глибині

Отже, що нам робити? Оскільки у PHP немає сильних типів, ми не можемо привести його до іншого типу.

Для цього існують шаблони проектування, які я буду обговорювати в наступних статтях, але PHP не дозволяє це зробити так просто, як деякі інші мови (наприклад, C# або Java).

Питання про поліморфізм

Сподіваємось, наведений вище код дає вам уявлення про те, як конкретний тип, такий як Post  або Page, може неявно мати властивості та методи свого базового класу Content, що використовуються під час виконання.

Але це також викликає кілька запитань, чи не так? Наприклад:

  • Чому поліморфізм корисний? Зрештою, це питання гнучкості. Тобто ви можете написати загальний  тип вмісту, а потім створити публікацію або сторінку, як ми бачили вище. Це дає нам усі переваги  класу Content, а також надає нам специфіку, наприклад, класу Post .
  • Це здається більше заплутаним, ніж гнучким. У певному сенсі це заплутано, тому що код вимагає трохи трасування. Тобто ви можете почати з  класу Post і шукати те, що пропонує клас Content . З іншого боку, це також спрощує введення нового  підкласу вмісту, а потім його використання, коли це найкраще підходить під час виконання.

Що стосується суперкласів і підкласів, то тут грає роль надійна IDE.

Завжди приємно мати редактор, який вам подобається, звичайно, але мати редактор, який може інтуїтивно визначити, що є батьківським класом, що є базовим класом тощо, може значно допомогти у відстеженні, налагодженні, слідкуванні та написанні нових код.

Але це вміст для іншої публікації, яка вийде після того, як ми поговоримо про шаблони проектування.

Джерело запису: tommcfarlin.com

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі