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>