HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Позднее связывание приводит к одному интересному следствию. Из базового класса можно вызывать методы и свойства, определённые в наследниках. Причём самих наследников может даже не существовать. Позднее связывание на то и позднее, что проверка происходит только в тот момент, когда этот код используется.</p>
1 <p>Позднее связывание приводит к одному интересному следствию. Из базового класса можно вызывать методы и свойства, определённые в наследниках. Причём самих наследников может даже не существовать. Позднее связывание на то и позднее, что проверка происходит только в тот момент, когда этот код используется.</p>
2 <p>Эту особенность используют в паттерне "шаблонный метод". Он применяется тогда, когда у подклассов есть общая логика, которая частично опирается на поведение подклассов. Такая логика реализуется в методе базового класса, а та часть которая различается (для каждого подкласса), делегируется наследникам.</p>
2 <p>Эту особенность используют в паттерне "шаблонный метод". Он применяется тогда, когда у подклассов есть общая логика, которая частично опирается на поведение подклассов. Такая логика реализуется в методе базового класса, а та часть которая различается (для каждого подкласса), делегируется наследникам.</p>
3 <p>Возьмём для примера наши теги. Посмотрите на метод __toString(). Видно, что его код, останется идентичным для большинства тегов. Единственное, что меняется - название самого тега.</p>
3 <p>Возьмём для примера наши теги. Посмотрите на метод __toString(). Видно, что его код, останется идентичным для большинства тегов. Единственное, что меняется - название самого тега.</p>
4 <p>Мы можем модифицировать код так, что метод __toString() переместится в HTMLElement. И единственная вещь, которая останется за подклассами - имя тега:</p>
4 <p>Мы можем модифицировать код так, что метод __toString() переместится в HTMLElement. И единственная вещь, которая останется за подклассами - имя тега:</p>
5 <p>Получившийся код лучше исходного варианта, так как он значительно сокращает дублирование (тегов около 100 штук!). Но есть одна загвоздка. Теги бывают одиночные, а значит текущий вариант __toString не подойдёт для них. Из этой ситуации можно выйти разными способами, например, с помощью наследования.</p>
5 <p>Получившийся код лучше исходного варианта, так как он значительно сокращает дублирование (тегов около 100 штук!). Но есть одна загвоздка. Теги бывают одиночные, а значит текущий вариант __toString не подойдёт для них. Из этой ситуации можно выйти разными способами, например, с помощью наследования.</p>
6 <p>Создадим у<em>HTMLElement</em>два подкласса: один<em>HTMLSingleElement</em>и<em>HTMLPairElement</em>. Теперь классы конкретных тегов должны наследоваться от одного из указанных классов. В каждом из этих классов будет своя реализация метода __toString().</p>
6 <p>Создадим у<em>HTMLElement</em>два подкласса: один<em>HTMLSingleElement</em>и<em>HTMLPairElement</em>. Теперь классы конкретных тегов должны наследоваться от одного из указанных классов. В каждом из этих классов будет своя реализация метода __toString().</p>
7 <p>Несмотря на различия в реализации __toString(), оба этих подкласса требуют от своих наследников реализации одного и того же метода getTagName().</p>
7 <p>Несмотря на различия в реализации __toString(), оба этих подкласса требуют от своих наследников реализации одного и того же метода getTagName().</p>