background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "Учим Kotlin с нуля | №22 Расширения."

input logo icon
Теги видео
|

Теги видео

kotlin
уроки
android
уроки kotlin
учить kotlin
программирование
уроки программирования
разработка
разработка android
backend разработка
язык программирования
курсы kotlin
обучение kotlin
ide
обучение программированию
основы kotlin
ооп
программирование для новичков
программирование с нуля
программирование kotlin
уроки котлин
язык котлин
учить котлин
андроид
программирование котлин
программирование онлайн бесплатно
изучение программирования
intellij idea
kotlin​​​​​
уроки​​​​​
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:01
котлин как расширение и в частности ее
00:00:04
подвид как расширения функций давайте
00:00:07
начнем с небольшого примера представим
00:00:10
что у нас есть какая-то переменная а с
00:00:15
которым мы положим строку например
00:00:17
халонг
00:00:20
теперь если нам понадобится когда-нибудь
00:00:23
в программе получить доступ к какой-либо
00:00:26
букве всем привет из слова хлоп получить
00:00:30
какая же у нее третья буква а как мы это
00:00:33
можем сделать мы можем обратиться к
00:00:35
строке как к массиву и скажем вместе
00:00:37
переменную b которая будет равна
00:00:41
переменной а под индексом
00:00:45
2 так как индексы у нас начинается с 0 0
00:00:49
индекс будет буква h 1 индекс буква и и
00:00:53
второй индекс буква л то есть 3 буквы мы
00:00:56
можем получить таким образом из любой
00:00:58
строке для того чтобы проверить что все
00:01:01
работает давайте запустим
00:01:03
распечатаем
00:01:06
переменную b мы видим что у нас все
00:01:09
сработало распечаталась буква л кстати
00:01:12
слову немножко отвлекусь я сейчас
00:01:15
использую семнадцатую версию java как вы
00:01:18
можете видеть в консоли начинал я этот
00:01:21
видеокурс записывалась 14 версии джавы
00:01:24
сейчас же актуально 17 последняя lts
00:01:27
версия вот поэтому если вдруг у вас
00:01:29
что-то будет не работать а у меня
00:01:31
работает то в первую очередь посмотрите
00:01:33
какая у вас версия java используется это
00:01:35
можно сделать в файл project fracture и
00:01:38
вот здесь из детей выберите свою версию
00:01:42
java если у вас нет 17 то добавьте и
00:01:46
скачайте так немножко отвлеклись в общем
00:01:49
у нас все работает распечатывается
00:01:50
третья буква л да и если мы где-то в
00:01:53
другом месте программы там условно
00:01:56
говоря в другом классе другой функции
00:01:57
опять же захотим получить 3 индекс к
00:02:01
вернее третью букву какой-то строки мы
00:02:02
можем это сделать с легкостью точно
00:02:04
также но в котлин есть способ как это
00:02:07
можно сделать более скажем так
00:02:09
правильным путем вместо того чтобы
00:02:12
каждый раз напрямую обращаться к индексу
00:02:14
какой-либо строки мы можем сам
00:02:16
непосредственно класс string который у
00:02:19
нас отвечает за значение вот такие в
00:02:21
строковые значения да это у нас класс
00:02:23
string код леня мы можем его расширить
00:02:26
добавив ему новую функцию так как мы
00:02:30
напрямую этот класс изменять не можем
00:02:32
это класс который
00:02:34
предоставили разработчики языках кокин
00:02:37
да мы его изменять не можем мы не можем
00:02:38
здесь написать какой-то код вы написано
00:02:41
файл esri том ли мы можем только
00:02:42
просматривать файлы мы не можем его
00:02:44
изменять вот но все же если нам
00:02:46
понадобилось добавить какой-то
00:02:48
дополнительный функционал в какой-либо
00:02:50
из классов в нашем случае в классе
00:02:52
string да мы хотим добавить новую
00:02:54
функцию которая будет возвращать нам
00:02:56
третью букву мы можем сделать это с
00:02:58
помощью функции расширений как это
00:03:00
выглядит в капкан мы объявляем функцию
00:03:03
расширения как обычную функцию дальше мы
00:03:06
должны указать какой именно класс мы
00:03:08
расширяем в нашем случае мы расширяем
00:03:10
класс string и
00:03:12
далее через точку мы должны придумать
00:03:15
название нашей функции которая будет
00:03:17
выполнять нашу работу
00:03:19
пускай это функция нас будет называться
00:03:21
get тот
00:03:24
вектор
00:03:26
получить третью букву это функции у нас
00:03:30
не будет принимать никаких параметров
00:03:31
потому что она всегда будет возвращать
00:03:33
только третью букву и дальше это
00:03:36
выглядит как обычная функция ну да мы
00:03:38
конечно должны сделать возвращаемый тип
00:03:41
эта функция что она будет у нас
00:03:43
возвращать значение типа чар чар это тип
00:03:47
который содержит 1 1 какой-либо символ
00:03:50
один символ com букву л буква а ! а там
00:03:54
неважно чем один символ этот тип чат я
00:03:56
не помню упоминал ли я это раньше но
00:03:58
есть такой тип и не собственно что мы
00:04:01
здесь делаем мы должны у той строки у
00:04:05
которой мы вызовем эту функцию вернуть
00:04:08
собственно третью букву здесь мы это
00:04:11
делали с помощью
00:04:13
обращение к строке
00:04:16
через имя переменной но дело в том что в
00:04:20
этой функции у нас нет этой переменной а
00:04:22
она у нас была функция main только
00:04:25
функция main мы определили переменную а
00:04:27
и так перемены она внутри этой функции
00:04:30
то оно и видно внутри этой функции
00:04:32
только
00:04:34
соответственно здесь мы не имеем доступа
00:04:36
никакой переменной но как же нам
00:04:38
получить доступ к собственно к той
00:04:40
строке у которой мы будем вызывать эту
00:04:43
функцию очень просто мы можем обратиться
00:04:46
к ней с помощью ключевого слова то есть
00:04:49
ключевое слово адрес обозначает что мы
00:04:51
обращаемся к текущему экземпляру у
00:04:53
которого будет вызвана эта функция
00:04:56
давайте попробуем вернуть это значение
00:04:59
так как мы хотим вернуть ему
00:05:02
и теперь собственно вместо того чтобы
00:05:04
делать напрямую вызывать какой-то индекс
00:05:07
у строки мы просто вызовем вызовем нашу
00:05:11
функцию то есть у переменной а у нас
00:05:14
теперь появляется доступ к функции лет
00:05:17
сорок лет а вот
00:05:19
так все просто изначально этой функции
00:05:22
не было в классе string но теперь
00:05:24
каким-то вот таким вот способом
00:05:26
магическим до полу магическим у нас
00:05:29
внутрь класса string который вроде бы
00:05:31
как нельзя изменять добавилась новая
00:05:33
функция get and later давайте проверим
00:05:36
как это сработает переменную b мы
00:05:39
распечатываем как и раньше
00:05:41
запускаем и видим что у нас все
00:05:44
сработало ok давайте попробуем ради
00:05:46
примера первую букву распечатать метод
00:05:49
переименовывать не будем печь
00:05:51
распечатываться все верно отлично ставим
00:05:53
чтобы распечаталась третья буква
00:05:57
значит как это работает напрямую мы
00:06:00
когда обращают вот это вот кстати
00:06:02
функцией я не сказал эта функция и
00:06:03
называется функцией расширением потому
00:06:06
что мы расширили класс string мы
00:06:09
добавили ему новую функцию на самом деле
00:06:12
класс string мы не изменяли в этом
00:06:14
случае вот эта функция оно добавится не
00:06:17
внутри класса string а вообще вне этого
00:06:19
класса но суть в том что в рандами мы
00:06:21
сможем ее вызывать уже как как будто бы
00:06:25
эта функция находится внутри класса
00:06:27
string хотя на самом деле оно там не
00:06:29
находятся мы не изменяем класс string
00:06:31
класс string у нас был изначально создан
00:06:34
разработчиками кокин мы его изменять не
00:06:35
можем никаким образом но мы можем его
00:06:38
расширять добавлять ему дополнительный
00:06:40
функционал с помощью функции расширений
00:06:42
это понятно что очень простой пример на
00:06:44
самом деле здесь может сложиться вопроса
00:06:46
почему вы просто каждый раз не
00:06:47
обращаться через квадратные скобочки до
00:06:50
скажем тот массив который нам нужен но
00:06:52
это просто такое очень простой пример на
00:06:54
самом деле если задаться целью но сейчас
00:06:57
вам покажу другие примеры как это можно
00:07:00
сделать как можно использовать функции
00:07:02
расширения вот такой простой пример
00:07:04
дальше давайте представим другой пример
00:07:07
скажем что у нас есть массив давайте я
00:07:10
это все пока закомментируем
00:07:13
представим что у нас есть
00:07:15
какой-то массив я назову его or
00:07:19
вызовем встроенную функцию в кантилим
00:07:22
rate of и пускай у нас будет массив из
00:07:27
из пяти чисел 1 2 3 4 5
00:07:32
теперь что если нам в программе
00:07:33
пригодится такой функционал чтобы мы
00:07:36
могли заменять какие-то элементы внутри
00:07:39
массива местами например мы хотим
00:07:41
поменять первый и последний элемент
00:07:43
местами как мы бы это делали обычным
00:07:45
способом скажем так классическим да мы
00:07:48
бы ввели какую-то переменную скажем
00:07:50
элемент 1
00:07:52
сохранили бы в нее то что хранится у нас
00:07:54
в
00:07:57
массиве рейд под индексом 0
00:08:01
дальше мы взяли бы
00:08:05
элемент 2
00:08:08
и
00:08:09
сохранили был в него то что у нас
00:08:11
хранится под индексом
00:08:15
длина массива
00:08:17
-1 до чтобы получить последние 3 класс
00:08:21
массив может быть разной длины это в
00:08:23
этом случае длиной 5 а может быть и
00:08:26
больше и меньше в общем чтоб нам на лету
00:08:29
узнать длину массива мы обращаемся через
00:08:31
его свойства . сайт и отнимаем единицу
00:08:35
потому что у нас индексы начинаются с
00:08:37
нуля а размер массива он если пять
00:08:41
элементов то у нас вернется сайт 5 но
00:08:43
индекс последнего элемента будет 4
00:08:45
поэтому нам нужно сделать -1 и
00:08:48
собственно все что нам остается сделать
00:08:49
это
00:08:51
положить в
00:08:54
массив под индексом 0
00:08:59
шаг элемент 2
00:09:02
в
00:09:04
массив под индексом
00:09:09
с -1
00:09:11
а жить собственно элемент 1 вот и все мы
00:09:15
поменяли первый элемент и последний
00:09:17
элемент местами давайте опять же
00:09:18
распечатаем
00:09:20
распечатаем
00:09:22
первый элемент и
00:09:24
распечатаем но с 4 последний элемент
00:09:27
давайте запустим посмотрим первый
00:09:31
элемент у нас теперь 5 хотя был один а
00:09:34
последний элемент 1 хотя был 5 все
00:09:37
работает мы поменяли местами два
00:09:39
элемента
00:09:40
массива теперь вы здесь логика уже
00:09:43
немножко побольше да то есть здесь целых
00:09:45
там четыре строки кода и если бы нам
00:09:48
необходимо было
00:09:51
использовать такой функционал в
00:09:53
нескольких местах программы мы бы
00:09:55
собственно пришли к тому что нам нужно
00:09:58
сделать функцию отдельную отдельную
00:10:00
функцию которая бы умела это делать
00:10:02
вопрос где эту функцию делать в каком
00:10:05
классе
00:10:06
понятно что идеально если бы эта функция
00:10:08
была внутри класса рей если мы перейдем
00:10:12
по ray of the увидим что ray of у нас
00:10:16
возвращает объект класса array то есть
00:10:20
вот тот класс внутри которого было бы
00:10:22
идеально это функция но опять же этот
00:10:24
класс он предоставлен разработчиками
00:10:26
языка и мы его изменять никак не можем
00:10:29
он readonly соответственно но опять же
00:10:31
можем прибегнуть к тому что сделаем
00:10:33
функцию расширения давайте сделаем
00:10:35
функцию расширения которая будет делать
00:10:36
вот этот функционал чуть пониже здесь
00:10:40
опять же в виду слова факту чего которое
00:10:44
означает что эта функция дальше нам
00:10:45
нужно указать тип который мы расширяем
00:10:47
мы расширяем тип рей так кто у нас
00:10:50
массив дальше мы дженерики или вообще не
00:10:54
еще не проходили пока что нужно просто
00:10:57
попытаться поверить потом понятно в
00:10:59
будущих темах мы к этому еще вернемся но
00:11:01
на данный момент просто принять то что
00:11:04
массивы и другие типы коллекции в котле
00:11:07
не в данном случае массивы они у нас
00:11:09
могут быть раме три зе раваны то есть в
00:11:11
данном случае у нас массив хранит
00:11:14
элементы типа int но также массив может
00:11:17
хранить любые другие элементы скажем
00:11:19
строки или там другие какие-то объекты
00:11:22
вообще да там каких-то юзеров адреса в
00:11:25
общем массив у нас может хранить то что
00:11:26
все что угодно и это обозначается буквой
00:11:29
т то что у нас массив может хранить все
00:11:32
что угодно нашем же случае у нас мы
00:11:34
используем только int да поэтому давайте
00:11:37
пока избавимся от этого ти и скажем что
00:11:40
у нас будет массив именно чисел далее мы
00:11:44
указали по примеру со стрингами тип
00:11:47
который мы расширяем массив из чисел и
00:11:51
дальше через точку мы пишем название
00:11:53
функции которую мы добавляем в этот
00:11:55
классу массива расширяем вернее пускай
00:11:58
это будет функция слаб
00:12:03
дальше давайте определимся что у нас
00:12:05
будет не просто меняться первый и
00:12:07
последний элемент а что мы что у нас эта
00:12:09
функция будет
00:12:11
настраиваться то есть мы сами будем
00:12:12
передавать какой элемент на какой мы
00:12:15
должны поменять например что у нас будет
00:12:17
передаваться в качестве первого элемента
00:12:20
например 0 и в качестве второго 5 что мы
00:12:23
должны поменять 0 и 5 элементы индексы
00:12:26
элемент этими индексами давайте введем
00:12:29
что у нас будет два параметра 1 этот
00:12:31
индекс 1 это будет конечно же int
00:12:36
и яндекс 2 это тоже будет int
00:12:41
дальше собственно нам нужно обратиться к
00:12:43
массиву и поменять
00:12:45
элементы под такими индексами уже не
00:12:48
hartke 1 что у нас 0 и последний а
00:12:51
именно под этими индексами давайте
00:12:54
скопируем этот код даже не скопируем а
00:12:57
лучше вырежем так как здесь у нас не
00:12:59
понадобятся эти строки нам понадобится и
00:13:02
вставим сюда здесь немножко нужно
00:13:05
поменять так как у нас доступ к массиву
00:13:08
уже не через имя переменной а точно так
00:13:10
же как и со строкой через ключевое слово
00:13:12
за из то есть рашим раз мы расширяем
00:13:14
массив то и обратиться к объекту этого
00:13:17
массива мы можем через из
00:13:21
100 0 у нас будет первый индекс который
00:13:23
мы будем передавать в качестве параметра
00:13:26
в качестве второго опять же здесь адрес
00:13:29
здесь будет не рейз с -1 а уже второй
00:13:33
индекс
00:13:34
мы сохранили в переменную первый индекс
00:13:36
сохранились перемен на второй индекс и
00:13:38
дальше мы меняем их местами
00:13:43
из
00:13:44
под индексом i-1 у нас будет элемент 2
00:13:50
ирис под индексом
00:13:54
едва будет элемент 1 jamik поменяли
00:13:57
местами теперь собственно мы можем точно
00:14:00
так же как и со строками мы можем уже у
00:14:03
этого массива
00:14:05
вызвать функцию club
00:14:09
и мы должны ственно передать два индекса
00:14:12
кем мы поменяем давайте мы поменяем
00:14:14
теперь второй и четвертый элементы это у
00:14:16
нас будут индексы 1 и 3
00:14:22
если мы сейчас да у нас ничего не
00:14:24
распечатать то что нас не происходит
00:14:26
никакой распечатки давайте как раз таки
00:14:27
попробуем распечатать весь массив
00:14:31
допустим
00:14:33
и видим да я совсем забыл что при
00:14:36
распечатке массива так какой-то объект у
00:14:38
нас котлин просто распечатывает адрес в
00:14:41
памяти этого объекта у нас в классе рей
00:14:46
ну верни включение в классе если мы
00:14:48
перейдем в него
00:14:50
рей у нас есть не переопределена метод
00:14:53
tostring
00:14:54
видите здесь нет только get set
00:14:57
конструктор и все здесь нет никакого ту
00:15:00
string метода соответственно у нас
00:15:02
распечатывается дефолтный метод tostring
00:15:04
который у нас у класса и не помним да из
00:15:07
предыдущих уроков что класс и не неявно
00:15:10
наследуется всеми классами в котлин том
00:15:12
числе и класса мэри соответственно у нас
00:15:14
дефолтное поведение метода ту string
00:15:17
функции и у нас распечатывается адрес
00:15:20
памяти давайте собственно для этого
00:15:22
вместо того что мы же не можем
00:15:23
переопределить tostring внутри класса
00:15:25
array давать тоже напишем функцию
00:15:29
функцию расширения для массива
00:15:33
для массива чисел который будет
00:15:36
называться просто print
00:15:40
она у нас принимать ничего не будет и
00:15:41
все что она будет делать это просто
00:15:43
распечатывать элементы массива каждый
00:15:44
элемент в новой строке я воспользуюсь
00:15:47
обычным циклом for если вы знакомы с
00:15:52
лямда выражениями то можно использовать
00:15:55
блин да выражения но мы еще не проходили
00:15:57
поэтому я буду пользоваться классическим
00:16:00
циклом for мы говорим что у нас будет и
00:16:03
ян пейс то есть мы перебираем некие
00:16:07
объекты ой которая находится внутри
00:16:10
массива мы через здесь обращаемся к
00:16:13
текущему массиву у которого будет вызван
00:16:16
метод свал в этом случае мы вызываем
00:16:19
метод swap у массива array которого вот
00:16:22
он да вот этот вот массив и собственно у
00:16:25
него
00:16:28
мы
00:16:29
перебираем эти элементы ой и все что нам
00:16:31
остается сделать это
00:16:35
распечатать эти элементы
00:16:40
теперь не через print алан а через опять
00:16:43
же у теперь у всех массивов у всех
00:16:46
массивов появился вернее у всех массивов
00:16:49
которые хранят числа важно появился
00:16:53
метод print
00:16:55
давайте запишем запустим теперь
00:16:59
и обидеться что он печаталась
00:17:02
1432 опять то есть 13 и 5 на своих
00:17:05
местах в 4 и 2 поменялись местами то
00:17:08
есть все сработало мы поменяли первый и
00:17:09
третий элемент теперь если мы захотим
00:17:11
поменять например 0 и 3
00:17:15
то у нас будет на первом месте 4 потом
00:17:18
два три и пять то есть 235 на своем
00:17:21
месте 4 и 1 поменялись местами все
00:17:23
работает как как часики как и должно
00:17:26
работать
00:17:27
теперь так как я уже упомянул в чем
00:17:29
прелесть такого подхода что теперь где
00:17:32
бы в программе мы не делали массив чисел
00:17:35
у нас у каждого из этих массивов будет
00:17:37
доступна функция print будет доступна
00:17:40
функция слаб и мы можем их использовать
00:17:41
как будто бы эти функции находятся
00:17:43
внутри самого класса array это очень
00:17:46
удобно в тех случаях когда мы не можем
00:17:50
модифицировать классы а в дальнейшем вы
00:17:52
будете работать с дополнительными
00:17:54
библиотеками которые предоставляют
00:17:56
сторонние вообще разработчики из понятно
00:17:59
что класс этих библиотек вы
00:18:00
редактировать не можете они только редон
00:18:03
ли вы можете их только использовать и
00:18:04
собственно благодаря вот этим функциям
00:18:06
расширений вы можете добавлять
00:18:08
дополнительный функционал к этим классом
00:18:10
к этим библиотекам
00:18:14
тщательную вещь но стоит вопрос
00:18:16
следующий как же нам сделать так чтобы
00:18:19
вот эти функции слаб и print они были
00:18:23
доступны для всех массивов давайте для
00:18:24
примера попробуем
00:18:26
сделать этот массив
00:18:32
из строк да это строки у нас и видите
00:18:36
что теперь функция слаб и print у нас
00:18:38
недоступны почему они доступны потому
00:18:40
что теперь у нас массив содержит
00:18:42
элементы типа string о функциях
00:18:44
расширения мы указали что эти функции
00:18:47
расширения будут относиться только к
00:18:48
массивам у которых элементы типа int
00:18:51
соответственно это не очень удобно нам
00:18:54
бы хотелось возможно чтобы так как сами
00:18:56
наши функции они не зависит от типа
00:18:58
элементов здесь мы просто меняем их
00:19:00
местами неважно какого типа данном по сути
00:19:03
неважно какой здесь тип мы просто хотим
00:19:05
поменять элементы местами а здесь тоже
00:19:07
абсолютно неважно какого элементы типа
00:19:09
потому что мы их просто распечатаны в
00:19:10
консоль поэтому было бы неплохо сделать
00:19:13
эти функции универсальными чтобы они
00:19:15
работали с любым типом как я уже
00:19:18
показывал у нас класс рэй он у нас
00:19:21
параметризирована
00:19:22
параметризирована и типа мы еще будем
00:19:24
проходить в будущем если сейчас не
00:19:26
понятно вам не обращайте внимание просто
00:19:28
нужно запомнить что если мы не знаем
00:19:33
заранее какой тип будет указываться
00:19:35
какой тип у нас будет использоваться в
00:19:37
массиве то мы указываем букву т вот в
00:19:40
таких угловых скобочках это значит что
00:19:42
массив у нас может принимать любой тип и
00:19:44
мы заранее не знаем какой
00:19:48
это все что нужно знать для того чтобы
00:19:50
переписать эти функции чтобы они
00:19:52
работали с любым типом массивов мы
00:19:54
должны вместо вот этих int указать букву
00:19:57
т но этого немножко недостаточно нужно
00:20:00
еще перед самим типом
00:20:03
я поставлю сразу два курсора также
00:20:05
указать этот тип такой синтаксис пока и
00:20:09
я понимаю что может быть не понятно не
00:20:11
обращайте на это внимание мы еще раз
00:20:13
говорю что вернемся к этому в будущих
00:20:15
уроках вы поймете что зато на этом
00:20:18
сейчас не стоит зацикливаться суть в том
00:20:21
что
00:20:22
так мы можем сделать вот эти функции
00:20:25
именно у массивов со строками такое не
00:20:29
нужно делать потому что строки а не мог
00:20:31
они имеют только один тип тип string да
00:20:33
там такое не излишне такой функционал
00:20:36
это работает только с массивами в данном
00:20:39
случае
00:20:40
значит теперь мы можем вызывать функции
00:20:43
слаб и print у абсолютно любых элементов
00:20:46
внутри массива у строк если мы уберем
00:20:48
строки назад вернем
00:20:52
обратно вернём числа все будет работать
00:20:55
давайте назад со строками попробуем и
00:20:58
попробуем заменить опять же 1 и 2
00:21:02
элементы просто а и b поменяем местами и
00:21:04
распечатаем
00:21:06
запустим видим что а и b у нас
00:21:09
поменялись местами c осталась на своем
00:21:11
месте и раз печатались они корректно
00:21:15
функцию слаб и print теперь у нас вообще
00:21:17
универсальные они у нас могут
00:21:20
использоваться в любом месте программы
00:21:21
где бы мы не определили массив
00:21:25
и они могут работать с абсолютно любым
00:21:28
типом данных
00:21:30
я надеюсь что с функциями расширениями
00:21:33
понятно но еще одна ремарочка что вот
00:21:36
эти функции расширения их можно
00:21:38
использовать не только с теми классами
00:21:40
которые нельзя изменять их можно
00:21:42
использовать абсолютно любыми классами
00:21:45
давать и третий пример рассмотрим это
00:21:48
закомментируем
00:21:50
рассмотрим третий пример здесь давайте
00:21:53
это немножко ниже опущу представим что у
00:21:57
нас есть какое-то самописный класс doc
00:22:02
и у нас тут есть одна функция
00:22:05
bork функция бар которая
00:22:09
просто будет распечатывать
00:22:11
buff как гавкает собака
00:22:15
собственно для этого класса док мы можем
00:22:17
точно также объявлять функция расширения
00:22:20
понятно что мы можем редактировать этот
00:22:22
класс да и можем ввести сюда функций
00:22:25
которые мы захотим но бывают приложение
00:22:28
где нежелательно модифицировать сами
00:22:31
класс и потому что что ты начнешь
00:22:33
трогательно сразу все сломается в общем
00:22:35
функции расширения тоже могут иметь
00:22:37
место когда нам нужно внести
00:22:39
дополнительный функционал в те функции
00:22:41
которые в те классы которые мы писали
00:22:43
даже сами то есть мы точно так же делаем
00:22:46
обращаемся к тому типу которую мы хотим
00:22:48
расширить док дух у нас не
00:22:50
параметризирована как массив нам здесь
00:22:52
не надо никаких угловых скобках и просто
00:22:54
мы пишем например
00:22:56
название функции которые ничего не
00:22:59
принимает и опять же любую логику
00:23:02
которая нам только понадобится это я
00:23:04
понятно использую только распечатку
00:23:06
строк просто для того чтобы
00:23:07
продемонстрировать возможности по факту
00:23:09
здесь может быть абсолютно любая логика
00:23:11
и здесь будет
00:23:14
что-то такое вот распечатываться теперь
00:23:17
уже в методе main мы можем создать
00:23:21
создать собаку и
00:23:23
у нее мы можем вызвать как функцию bork
00:23:27
так и функцию
00:23:30
sleep несмотря на то что у нас внутри
00:23:33
класса док нет никакой функции слив
00:23:35
опять же повторяю что
00:23:38
функция слип у нас не модифицирует вот
00:23:42
функция расширения она не модифицирует
00:23:44
сам класс она добавляется поверх него
00:23:46
запустим давайте и посмотрим как он все
00:23:48
сработает
00:23:50
работа лаву сработала м slipping отлично
00:23:53
все работает дальше есть еще один такой
00:23:56
нюанс когда у нас в классе есть эта
00:24:01
функция вы давайте на примере bork и мы
00:24:03
например
00:24:06
чай насти или я не знаю просто мы не
00:24:08
знали что в классе есть такая функция
00:24:10
например мы делаем функцию расширения
00:24:13
для dok
00:24:14
которая называется точно также как
00:24:18
функция которая уже есть внутри класса
00:24:20
док да вот что будет в этом случае
00:24:22
допустим здесь мы распечатаем
00:24:28
что в этом случае произойдет давайте
00:24:30
запустим сливки я уже вызывать не будут
00:24:32
давайте станем просто парк внутри
00:24:35
методами вызываем и все в методе main вы
00:24:39
видите что все равно
00:24:40
распечатывать в то есть работал метод
00:24:43
который внутри самого класса потому что
00:24:46
если мы делаем функцию расширения с
00:24:48
таким же названием как существующая
00:24:51
функция внутри класса то функция которая
00:24:54
внутри класса она всегда считается более
00:24:56
приоритетной
00:24:57
это может быть полезно когда вы еще раз
00:25:00
говорю не знаете какие есть функции
00:25:02
какие нет например случайно вы решили
00:25:04
сделать функцию расширения которая
00:25:07
делает что-то дополнительное но назвали
00:25:10
ее случайно таким же именем как уже
00:25:12
используется в этом классе кокин вам
00:25:14
этого сделать не даст то есть это
00:25:16
валидный синтаксис у вас ошибок никаких
00:25:19
не будет эта функция просто будет
00:25:21
игнорироваться всегда будет вызываться
00:25:22
то функция которая находится внутри
00:25:24
класса если она имеет такое же название
00:25:26
если бы мы
00:25:28
запустили такое приложение в реальной
00:25:30
жизни посмотрели бы она что наш мир не
00:25:32
работает то соответственно мы вы поняли
00:25:34
что у нас такая функция уже наверняка
00:25:36
есть и значит я вам нужно переименовать
00:25:38
старатель назовем f бар то музыку собаки
00:25:41
не мяукают
00:25:42
гавкают и собственно здесь мы можем
00:25:45
вызвать как bork так и freak bork теперь
00:25:48
функция bork будет вызвана изнутри
00:25:50
класса так как она только здесь и
00:25:53
существует теперь a fake bork это у нас
00:25:55
функция расширения даже 3g идея
00:25:57
подчеркивает другим хайлайта в общем
00:26:00
выделяет эту функцию расширения
00:26:01
по-другому в отличие от обычной функции
00:26:04
в общем запустим в последний раз и видим
00:26:07
что сначала у нас отработал обычно
00:26:09
функция бар втором случае fake бар все
00:26:12
работает я
00:26:14
надеюсь что с функциями расширениями
00:26:17
квас теперь проблем никаких не будет
00:26:20
можно их использовать как с классами
00:26:23
которые вы писали сами или которые
00:26:26
существуют у вас в проекте так и с
00:26:28
классами что более предпочтительно
00:26:30
использовать функции расширения с
00:26:32
классами которая вы модифицировать не
00:26:35
можете напрямую но хотите в них добавить
00:26:37
дополнительный полезный функционал
00:26:39
который может использоваться в любом
00:26:41
месте вашего приложения
00:26:43
на этом у меня все надеюсь было полезно
00:26:45
ставьте лайки пишите комментарии что
00:26:48
было непонятно будем разбираться и
00:26:50
подписывайтесь на канал всем спасибо
00:26:53
пока

Описание:

Полный видеокурс по языку программирования Kotlin. В двадцать втором уроке разбираем расширения. !!Важно!! Повторяйте руками весь код, который вы видите на видео. Просто просмотреть недостаточно. Если возникают вопросы/ошибки пишите в комментах. Будем разбираться вместе. Язык программирования Kotlin используют для создания бэкенда веб-приложений и приложений для Android. Язык похож на Java, но проще по синтаксису. Молодой и востребованный на рынке язык программирования.

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "Учим Kotlin с нуля | №22 Расширения."?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "Учим Kotlin с нуля | №22 Расширения." выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "Учим Kotlin с нуля | №22 Расширения."?mobile menu icon

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

mobile menu iconКак скачать видео "Учим Kotlin с нуля | №22 Расширения." на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Учим Kotlin с нуля | №22 Расширения."?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "Учим Kotlin с нуля | №22 Расширения."?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.