JS: Погружаясь в классы
Теория: Шаблонный метод
Позднее связывание приводит к одному интересному следствию. Из базового класса можно вызывать методы и свойства, определенные в наследниках. Причем самих наследников может даже не существовать. Позднее связывание на то и позднее, что проверка происходит только в тот момент, когда этот код используется.
Эту особенность используют в паттерне "шаблонный метод". Он применяется тогда, когда у подклассов есть общая логика, которая частично опирается на поведение подклассов. Такая логика реализуется в методе базового класса, а та часть, которая различается (для каждого подкласса), делегируется наследникам.
Возьмем для примера наши теги.
Посмотрите на метод toString(). Видно, что его код останется идентичным для большинства тегов. Единственное, что меняется – название самого тега.
Мы можем модифицировать код так, что метод toString() переместится в HTMLElement. И единственная вещь, которая останется за подклассами – имя тега:
Получившийся код лучше исходного варианта, так как он значительно сокращает дублирование (тегов около 100 штук!). Но есть одна загвоздка. Теги бывают одиночные, а значит текущий вариант toString() не подойдет для них. Из этой ситуации можно выйти разными способами, например, с помощью наследования.
Создадим у HTMLElement два подкласса: один HTMLSingleElement и HTMLPairElement. Теперь классы конкретных тегов должны наследоваться от одного из указанных классов. В каждом из этих классов будет своя реализация метода toString().
Несмотря на различия в реализации toString(), оба этих подкласса требуют от своих наследников реализации одного и того же метода getTagName().




