JS: Погружаясь в классы
2026-02-26 22:30 Diff

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

Эту особенность используют в паттерне "шаблонный метод". Он применяется тогда, когда у подклассов есть общая логика, которая частично опирается на поведение подклассов. Такая логика реализуется в методе базового класса, а та часть, которая различается (для каждого подкласса), делегируется наследникам.

Возьмем для примера наши теги.

Посмотрите на метод toString(). Видно, что его код останется идентичным для большинства тегов. Единственное, что меняется – название самого тега.

Мы можем модифицировать код так, что метод toString() переместится в HTMLElement. И единственная вещь, которая останется за подклассами – имя тега:

Получившийся код лучше исходного варианта, так как он значительно сокращает дублирование (тегов около 100 штук!). Но есть одна загвоздка. Теги бывают одиночные, а значит текущий вариант toString() не подойдет для них. Из этой ситуации можно выйти разными способами, например, с помощью наследования.

Создадим у HTMLElement два подкласса: один HTMLSingleElement и HTMLPairElement. Теперь классы конкретных тегов должны наследоваться от одного из указанных классов. В каждом из этих классов будет своя реализация метода toString().

Несмотря на различия в реализации toString(), оба этих подкласса требуют от своих наследников реализации одного и того же метода getTagName().