HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Может ли нам понадобиться когда-нибудь создавать объекты класса<em>HTMLElement</em>? Наверняка нет. Вся работа строится на базе конкретных элементов, а значит, на практике, всегда используются его наследники.</p>
1 <p>Может ли нам понадобиться когда-нибудь создавать объекты класса<em>HTMLElement</em>? Наверняка нет. Вся работа строится на базе конкретных элементов, а значит, на практике, всегда используются его наследники.</p>
2 <p>В PHP классы, объекты которых не имеют смысла, принято помечать специальным ключевым словом abstract. Тогда никто не сможет создать объект этого класса напрямую. Только через наследников. В остальном, абстрактный класс такой же класс, со своими методами и свойствами.</p>
2 <p>В PHP классы, объекты которых не имеют смысла, принято помечать специальным ключевым словом abstract. Тогда никто не сможет создать объект этого класса напрямую. Только через наследников. В остальном, абстрактный класс такой же класс, со своими методами и свойствами.</p>
3 <p>Абстрактные классы имеют смысл только в связке с наследованием. В большинстве случаев не нужно создавать объект от базового класса, поэтому его логично пометить как абстрактный.</p>
3 <p>Абстрактные классы имеют смысл только в связке с наследованием. В большинстве случаев не нужно создавать объект от базового класса, поэтому его логично пометить как абстрактный.</p>
4 <p>Ещё одна особенность абстрактных классов связана с использованием интерфейсов. Абстрактный класс, в отличие от конкретного, не должен реализовывать интерфейсы полностью. Всё, что не реализовывает абстрактный класс, должны реализовать его наследники. Рассмотрим конкретный пример. Каждый объект, описывающий конкретный DOM-элемент, имеет текстовое представление в виде HTML-тега. Это значит, что каждый класс, наследующий HTMLElement, должен реализовывать определённый метод, возвращающий кусок HTML. В такой ситуации можно ввести специальный интерфейс<em>Showable</em>(обычно так называют интерфейсы, которые отвечают за строковое представление), содержащий один метод __toString().</p>
4 <p>Ещё одна особенность абстрактных классов связана с использованием интерфейсов. Абстрактный класс, в отличие от конкретного, не должен реализовывать интерфейсы полностью. Всё, что не реализовывает абстрактный класс, должны реализовать его наследники. Рассмотрим конкретный пример. Каждый объект, описывающий конкретный DOM-элемент, имеет текстовое представление в виде HTML-тега. Это значит, что каждый класс, наследующий HTMLElement, должен реализовывать определённый метод, возвращающий кусок HTML. В такой ситуации можно ввести специальный интерфейс<em>Showable</em>(обычно так называют интерфейсы, которые отвечают за строковое представление), содержащий один метод __toString().</p>
5 <p>И использование:</p>
5 <p>И использование:</p>
6 <p>С одной стороны здесь написано что абстрактный класс реализует интерфейс, с другой, так как класс абстрактный, мы можем не реализовывать Showable напрямую. Но это обязательно придётся сделать в наследниках, что нам и нужно.</p>
6 <p>С одной стороны здесь написано что абстрактный класс реализует интерфейс, с другой, так как класс абстрактный, мы можем не реализовывать Showable напрямую. Но это обязательно придётся сделать в наследниках, что нам и нужно.</p>
7 <p>Абстрактные классы могут иметь абстрактные методы, фактически это сигнатуры методов, а не сами методы. В этом смысле они становятся похожи на интерфейсы.</p>
7 <p>Абстрактные классы могут иметь абстрактные методы, фактически это сигнатуры методов, а не сами методы. В этом смысле они становятся похожи на интерфейсы.</p>
8 <p>С появлением абстрактных классов возникает множество новых вопросов. Когда они нужны, а когда нет? Можно ли использовать абстрактные классы вместо интерфейсов? Как совмещать их с интерфейсами?</p>
8 <p>С появлением абстрактных классов возникает множество новых вопросов. Когда они нужны, а когда нет? Можно ли использовать абстрактные классы вместо интерфейсов? Как совмещать их с интерфейсами?</p>
9 <p>Абстрактные классы не фундаментальная концепция и не обязательная часть ООП. Более того, в большинстве ООП языков абстрактных классов нет. Однако нельзя сказать что код на них пишется хуже, скорее наоборот. Например, в Ruby, JavaScript и Python абстрактных классов нет, но есть наследование и есть классы, которые можно было отметить как абстрактные, однако создатели этих языков не стали вводить это понятие в язык. Никогда нельзя забывать, что любые новые сущности, упрощая в одном месте, увеличивают общую сложность из-за возрастающего числа комбинаций этих сущностей друг с другом.</p>
9 <p>Абстрактные классы не фундаментальная концепция и не обязательная часть ООП. Более того, в большинстве ООП языков абстрактных классов нет. Однако нельзя сказать что код на них пишется хуже, скорее наоборот. Например, в Ruby, JavaScript и Python абстрактных классов нет, но есть наследование и есть классы, которые можно было отметить как абстрактные, однако создатели этих языков не стали вводить это понятие в язык. Никогда нельзя забывать, что любые новые сущности, упрощая в одном месте, увеличивают общую сложность из-за возрастающего числа комбинаций этих сущностей друг с другом.</p>
10 <p>Общая рекомендация, не придавайте слишком много значения абстрактным классам. Используйте их тогда, когда класс имеет смысл пометить абстрактным, но не более того. Как вы увидите позже, абстрактные классы, вместе с наследованием, успешно заменяются трейтами. Причём последние гораздо более гибкий инструмент.</p>
10 <p>Общая рекомендация, не придавайте слишком много значения абстрактным классам. Используйте их тогда, когда класс имеет смысл пометить абстрактным, но не более того. Как вы увидите позже, абстрактные классы, вместе с наследованием, успешно заменяются трейтами. Причём последние гораздо более гибкий инструмент.</p>