Здравствуйте всем, это первая серия сериала “ООП здорового человека”. Есть 3 механизма, без которых ООП не ООП – это наследование, инкапсуляция и полиморфизм. Также, есть механизм “сокрытие”, который приписываю к части инкапсуляции.
Наследование
Наследование — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения. Эт-то о че нам говорит статья Википедии… я же предлагаю пока не рассматривать абстракцию(поскольку это не необходимое условие для данного механизма), а рассмотреть само явление наследования. Как и в жизни, наследник получает в свое распоряжение активы наследуемого; на примере класса Person
из этой статьи:
<?php class Person { public int $id; public string $name; public string $secondName; public string $sex; public string $birthday; public function toArray() { return get_object_vars($this); } }
допустим персона это частный случай каких-то единиц(персона наследует элемент)
<?php class Item { public int $id; public string $name; public function toArray() { return get_object_vars($this); } } class Person extends Item { public string $secondName; public string $sex; public string $birthday; }
При этом класс Person
включает все методы и свойства класса Item
<?php // классы ранее print_r(get_class_methods('Person')); print_r(get_class_vars('Person')); // вывод Array ( [0] => toArray ) Array ( [secondName] => [sex] => [birthday] => [id] => [name] => )
Однако, их(активы наследуемого класса) можно скрыть от наследника – об этом в следующей статье. Смысл наследования состоит в минимальном копи-пасте кода. В некоторых языках наследоваться можно от многих, в других же – от одного класса(пример PHP – там множественное наследование спародировано трейтами – об этом в следующих сериях).
Инкапсуляция
Инкапсуляция (англ. encapsulation, от лат. in capsula) — размещение в одном компоненте данных и методов, которые с ними работают. В реализации большинства языков программирования обеспечивает механизм сокрытия, позволяющий разграничивать доступ к различным компонентам программы. Этот принцип в классе Person
сохранен, т.к. все методы класса работают с данными, лежащими в нем же.
Инкапсуляция считается неполной если не реализовано сокрытие. Сокрытие – запрет на прямой доступ к полям объекта, вместо этого – доступ через модификаторы. На примере класса Item
это выглядит так
<?php class Item { protected int $id; protected string $name; public function setId($id) { $this->id = (int) $id; } public function getId() { return $this->id; } public function setName($name) { $this->name = strval($name); } public function getName() { return $this->name; } public function toArray() { return get_object_vars($this); } }
Для сокрытия модификатор (свойства) public заменяется на protected/private(о разнице также в следующих сериях) и доступ открывается через “сеттеры” и “геттеры”(собственно, модификаторы).
Полиморфизм
И снова Википедия: “Полиморфизм в языках программирования и теории типов — способность функции обрабатывать данные разных типов”. Если мы рассмотрим класс Item
(вариант с сокрытием), то метод setId
(setName
также) имеет в себе реализацию полиморфизма, т.к. принимает в себя параметр различных типов и приводит его к нужному.