HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p><strong>Делегирование</strong>-- это шаблон ООП, позволяющий одному объекту перенаправить запросы другому объекту. В каком-то смысле делегирование может быть альтернативой наследованию. У языка программирования<strong>Kotlin</strong>в этом случае есть плюс: он нативно поддерживает вышеописанный паттерн, предоставляя нужный инструментарий.</p>
1 <p><strong>Делегирование</strong>-- это шаблон ООП, позволяющий одному объекту перенаправить запросы другому объекту. В каком-то смысле делегирование может быть альтернативой наследованию. У языка программирования<strong>Kotlin</strong>в этом случае есть плюс: он нативно поддерживает вышеописанный паттерн, предоставляя нужный инструментарий.</p>
2 <p>Формальный синтаксис выглядит следующим образом:</p>
2 <p>Формальный синтаксис выглядит следующим образом:</p>
3 <p>Итак, у нас присутствует интерфейс<strong>Base</strong>, определяющий некоторый функционал. Также присутствует его реализация в качестве класса<strong>BaseImpl</strong>. Существует и класс<strong>Derived</strong>, тоже использующий интерфейс<strong>Base</strong>, при этом после указания используемого интерфейса следует ключевое слово<strong>by</strong>, ну а уже после него -- объект, которому непосредственно и будут делегироваться вызовы.</p>
3 <p>Итак, у нас присутствует интерфейс<strong>Base</strong>, определяющий некоторый функционал. Также присутствует его реализация в качестве класса<strong>BaseImpl</strong>. Существует и класс<strong>Derived</strong>, тоже использующий интерфейс<strong>Base</strong>, при этом после указания используемого интерфейса следует ключевое слово<strong>by</strong>, ну а уже после него -- объект, которому непосредственно и будут делегироваться вызовы.</p>
4 <p>Таким образом, в нашей схеме класс<strong>Derived</strong>станет делегировать вызовы объекту<strong>someBase</strong>(объект представляет интерфейс<strong>Base</strong>, а также передается через первичный конструктор). Также следует понимать, что Derived может и не реализовать интерфейс Base либо сделать это не в полной мере (будут реализованы лишь отдельные функции и свойства).</p>
4 <p>Таким образом, в нашей схеме класс<strong>Derived</strong>станет делегировать вызовы объекту<strong>someBase</strong>(объект представляет интерфейс<strong>Base</strong>, а также передается через первичный конструктор). Также следует понимать, что Derived может и не реализовать интерфейс Base либо сделать это не в полной мере (будут реализованы лишь отдельные функции и свойства).</p>
5 <p>Например, рассмотрим следующие классы:</p>
5 <p>Например, рассмотрим следующие классы:</p>
6 <p>Идем дальше. У нас определен интерфейс<strong>Messenger</strong>, условно представляющий программу по отправке сообщений, для чего определена функция send().</p>
6 <p>Идем дальше. У нас определен интерфейс<strong>Messenger</strong>, условно представляющий программу по отправке сообщений, для чего определена функция send().</p>
7 <p>Кроме того, существует класс<strong>InstantMessenger</strong>, представляющий собой, по сути, программу мгновенных сообщений (мессенджер). Он задействует интерфейс Messenger и реализует его функцию send().</p>
7 <p>Кроме того, существует класс<strong>InstantMessenger</strong>, представляющий собой, по сути, программу мгновенных сообщений (мессенджер). Он задействует интерфейс Messenger и реализует его функцию send().</p>
8 <p>Потом определен класс<strong>SmartPhone</strong>, представляющий, соответственно, смартфон -- он тоже использует интерфейс Messenger, однако не реализует его, так как вместо реализации он принимает объект Messenger через первичный конструктор, делегируя ему обращение к функции send().</p>
8 <p>Потом определен класс<strong>SmartPhone</strong>, представляющий, соответственно, смартфон -- он тоже использует интерфейс Messenger, однако не реализует его, так как вместо реализации он принимает объект Messenger через первичный конструктор, делегируя ему обращение к функции send().</p>
9 <p>Теперь применим классы:</p>
9 <p>Теперь применим классы:</p>
10 <p>Итак, мы создали объект<strong>pixel</strong>, представляющий класс<strong>SmartPhone</strong>. Так как<strong>SmartPhone</strong>использует интерфейс<strong>Messenger</strong>, у нас есть возможность в целях отправки условного сообщения вызвать у объекта<strong>pixel</strong>функцию send(). Но важно понимать, что сам по себе<strong>класс SmartPhone НЕ реализует send-функцию</strong>, так как непосредственное выполнение данной функции делегируется объекту telegram, и именно он в реальности отправляет сообщение. Следовательно, при выполнении нашего программного кода мы увидим консольный вывод следующего характера:</p>
10 <p>Итак, мы создали объект<strong>pixel</strong>, представляющий класс<strong>SmartPhone</strong>. Так как<strong>SmartPhone</strong>использует интерфейс<strong>Messenger</strong>, у нас есть возможность в целях отправки условного сообщения вызвать у объекта<strong>pixel</strong>функцию send(). Но важно понимать, что сам по себе<strong>класс SmartPhone НЕ реализует send-функцию</strong>, так как непосредственное выполнение данной функции делегируется объекту telegram, и именно он в реальности отправляет сообщение. Следовательно, при выполнении нашего программного кода мы увидим консольный вывод следующего характера:</p>
11 <p>В следующий раз поговорим про множественное делегирование.</p>
11 <p>В следующий раз поговорим про множественное делегирование.</p>
12 <p><em>По материалам https://metanit.com/.</em></p>
12 <p><em>По материалам https://metanit.com/.</em></p>
13 <p>Хотите знать о Kotlin больше? Обратите внимание на<a>следующий курс</a>.</p>
13 <p>Хотите знать о Kotlin больше? Обратите внимание на<a>следующий курс</a>.</p>
14  
14