Подготовка к собеседованию на Flutter Developer
Менторы
Специалисты своей области, которые смогут помочь вам
Middle .Net Developer
Senior Product Manager
Middle Python Developer
Ведущий программист
Backend Software Engineer (PHP)
Senior .NET/C# developer
Middle DevOps Engineer | Tbilisi, Georgia
Middle C# .NET
Senior PHP-разработчик
Middle python developer
Каналы
Полезные Telegram каналы и чаты
Транскрипция видео:
Сегодня мы обсудим собесы флотариста и какие классические вопросы на них бывают А так как их очень много то их нужно поделить на части и конечно же надо начать именно с Дарта Ну поехали что же сегодня ждёт нас а много чего интересного на самом деле разные всякие заклинания наподобие warfinal cost динамик или там что эти нас или минус и разберёмся про лист почему он не такой хорош как сет И когда его лучше применять А когда не нужно вот узнаем насколько вкусен синтаксический сахар и что же ты получишь наследство а получишь
00:00:00 - 00:01:27
ты экстенденс миксенс и всякое такое первый же вопрос который чаще всего задают это про ключевые слова и одно из них понятно что такое слово которое используется для создания переменных и если его расшифровывать разводить это в рейбу что и означает изменяемое в процессе работы программу можно присваивать там новые всякие значения переменных но в рамках определенного типа протип узнает анализатор и вот как Здесь представлен пример когда мы присвоили наши переменные а12 он понял что это int И теперь мы можем к ней
00:00:43 - 00:01:59
присваивать какое-то новое значение в рамках типа int и это будет у нас шесть и когда мы выводим мы получаем нашу шестёрочку Следующий вопрос который может задать интервью нам это Чем отличается варденамик не из следующего человека этот вопрос Может поставить в тупик потому что он позволяет задуматься над тем знает лишь человек Что такое динамик и так как мы сказали что вард ключевое слово то Признаем стоит сказать что это тип данных и он не является ключевым словом и пройти nake мы обсудим позже А по поводу Var ещё остались
00:01:22 - 00:02:32
вопросы в интерьеры и он спрашивает А можем ли изменить тип У нашего Var как я уже сказал тип определяется анализатором и он не изменяется после того как мы инициализировали нашу переменную так как анализатор решил что она будет именно этого типа и будет она такой именно этого типа всегда Как видите из примера мы не можем присвоить строку к переменной которая уже была инициализирована intom но у Вара есть некоторые проблемы и нужно отметить тут важный нюанс что при прочтении кода может возникнуть вопрос про Тип и если
00:01:57 - 00:03:05
зачастую вот при инициализации непонятно какой именно тип мы получаем из той или иной функции не зная где определена эта функция то сложно сказать что за возвращаемый тип будет у нашей переменной Вот и поэтому лучше указывать конкретный тип где только возможно для предупреждения Таких вот случаев в анализаторе настраиваются правила линтера и как раз таки вопрос про динамик динамик как я уже сказал изменяемый тип данных и если его использовать без всяких дополнительных ключевых слов как const и Final то это
00:02:31 - 00:03:48
будет переменной и мы можем присваивать этой переменной любое значение вот Вар этого было делать нельзя А вот в динамик как раз таки можно было у нас винтовая пускай будет переменная строковая Нет проблем вот а подумаем что же такое ноут сети Ну сети появилась Ну относительно и давно недавно поэтому вопрос животрепещущий на самом деле и многим задают его на собеседование и что же нужно ответить ответить можно просто Что у нас раньше был один Тип который содержал в себе определенный Тип и мог содержать Ещё себе Ну а теперь мы это
00:03:09 - 00:04:37
поведение разделили и с помощью вопросика мы можем определять типы содержащие и типа содержащие Ну вот По примеру можно увидеть что мы можем не инициализировать переменную если она нуле был возможно имеет возможность хранить себе ну и при выводе её мы получим null А если она не имеет возможности хранить Ну то мы получим ошибку при использовании этой переменной потому что её нужно предварительно инициализировать каким-то значением пронулся эти стоят остановиться поподробнее потому что ну с этим принесло дополнительные
00:03:54 - 00:05:12
операции и возможности в анализаторе и поэтому может возникнуть вопрос что вот означает это вот этот символ с вопросиком Ну 10 достаточно всё просто тоже он конечно же означает что если у нас значение у переменной будет Ну то тогда и возвращаем всё возвращаемое значение будет у него Ну и все операции которые шли после вот этого знака вопроса они чувствуется не выполняются также появилась еще оператор Bank очень интересный Такой оператор и он говорит анализатору что если у переменной Тип который разрешает ноут то
00:04:32 - 00:05:50
мы уверены что в этом случае Ну никогда не будет и можем спокойно использовать эту переменную как но безопасную Ну как самонадеянно честно говоря потому что мы успокоили анализатор но не успокоили не успокоили компилятор и поэтому когда мы запускаем нашу программу врантайме то она может сломаться в любой момент когда все-таки у нас окажется Ну и как видно из примера мы эту ошибку здесь и словили как же очистить переменную от нула есть несколько способов и ну таким образом можем успокоить анализатор что а-а Ну да в наши перемен
00:05:12 - 00:06:37
не будет каким же образом Мы спрашиваем в условия если у нас Ну либо значит Мы выполняем какое-то действие А если она не нулибо то после вот этого блока с проверкой можно спокойно ее использовать так как анализатор Уже понимает что проверка на null пройдена также есть еще и вариант когда мы проверяем что переменная точно не ну и тогда в нашем условии анализатор понимает что в рамках вот этих двух скобочек наши переменная А обязательно будет но безопасный она точно будет без нула её можно спокойно
00:05:54 - 00:07:13
использовать поговорили про null saft Интересно что же в итоге стало теперь с типами у нас в во флатере А и В дате достаточно интересно поменялось всё так как и раньше а ну удержал в основе А теперь это поведение изменилось и Как видно из схемы самый главный тип - это обжиг с вопросом который себе как раз таки тоже содержит Ну он расходится на Ob закинул и дальше уже наследуются остальные типы и тут стоит сказать нашему интерьеру что так как есть верхний уровень уйтип то есть и не железа не железа лежащий тип Нижний Тип
00:06:34 - 00:07:58
и это уже не ну а какое-то магический Невер тут вопрос что же такое Невер и где его можно использовать Это вопрос к ЗАО Если кто-то готов на него ответить прямо сейчас вы будете большой молодец кто-то готов выбросить exection выбросить Exception что Never выбрасывает эксепшен и нет функция Ну допустим Never Return типа и там внутри функции допустим frow exection То есть она никогда не закончится по идее близко хорошо отлично это типа указывающий что будет получено ошибкой код далее не будет запущен Так что Федя был прав и
00:07:16 - 00:08:30
это статический тип выражения шоу выражение никогда не сможет успешно завершить свои вычисления оно но выдать исключение прервать свое выполнение или иным образом гарантировать что окружающий её код ожидающий результат выражения никогда не запустится что ж продолжаем дальше есть ли такой тип Ну как мы видели с вами из дерева которые строят наши типы но все-таки существует и вот как раз таки пример применения типа ну но на практике это встречается Очень редко и я честно говоря ни разу не видел так как у нас есть обжег с
00:07:53 - 00:09:04
вопросом он наследуется от него наследуется обжиг и Ну в чём схожие и чем отличается файл новый конст в чём различие неизменяемости квесты файл как раз таки два вопроса которые выясняют понимаете человек Зачем лучше использовать Кост А чем файл и конкретно сказать что Final - это Константа создаваемая во время выполнения кода runtime Константа а Константа константы создаваемое во время компиляции кода Camel Константа и так как сложно Final Как это называть часто константы потому что зачастую она очень часто меняется в
00:08:29 - 00:09:48
коде Вот то обычно Её называют переменной но стоит в уме держать что всё-таки это Константа во время выполнения кода runtime constant и что же отличает на самом деле конский файл - это то что контст объекты вычисляется только один раз при компиляции а файл вычисляется Каждый раз когда происходит инициализация новым значением А вот как раз поэтому я и рассказал что файл часто путают с переменной Просто она чаще инициализируется чем конст вот такие пирожочки ну и как применяется вообще конст В каких случаях о этих случаев
00:09:08 - 00:10:24
немало Но все не означает что просто наше значение будет Константа есть глобальная константы которые вне всяких функций класса объявляется вот статические константы которые объявляются внутри класса полем Статик локальные константы которые находятся внутри какой-то функции константные конструкторы которые означают что данный конструктор можно вычислить один раз он будет константным Вот и создание объекта из константного конструктора То есть это вот все способы применения вот этого ключевого слоя теперь посмотрим как это
00:09:46 - 00:10:58
выглядит вживую как раз вот все вот эти примеры вне кода глобальное применение внутри класса применение нашего сайс константные конструктор и ему можно присвоить какое-то дефолтное значение которое тоже Обязательно должно быть константным и так как у нас все поля у константного класса то значит конструктор может быть константным здесь же применяется вызов всех вот этих константных значений то есть здесь мы создаём локальную константу создаём константное значение из нашего константного конструктора вот константное значение
00:10:22 - 00:11:44
Баттон и используем их приводе вот немножко подробнее про константные конструкторы могут спросить почему вообще контактные конструкторы используются и что они вообще позволяют сделать они позволяют вычислить как раз-таки канонические экземпляр объекта который уже будет использоваться повторно при постоянных что как я и сказал при постоянных значениях постоянное значение вот здесь у нашей точки 1,1 значит э мы вычислили объект один раз и можем Каждый раз к нему обращаться Вот так и работает конст
00:11:03 - 00:12:09
почаще Используйте концы чем файл если для этого возможно Вот например А почему в данном случае не получается сделать константным вот этот конструктор потому что данное значение Они изменяемые то есть у нас а это объект который в принципе там будет меняться и они не он не является контентом сам по себе А наши int 1.1 являются константными а объект вот этот daytime Now он не является концентратом если мы в аргументы Передаем неконстантное значение то мы теряем расчеты наши которые мы могли провести один раз а теперь придется
00:11:36 - 00:12:52
делать их каждый раз Можем ли мы изменить Объект который файл такой вопрос на самом деле скользкий не совсем он точный я бы сказал он больше открытый Что подразумевается под объектом то есть вот здесь сам объект мы который присваиваем Final уже сменить не сможем Да но изменить внутреннее состояние объекта мы сможем и например такое есть вопрос что если мы например файл Лис создадим то Сможем ли мы что-то с него добавить конечно так как объект менять внутреннюю структуру можем давить но опять же есть тоже ограничение если
00:12:14 - 00:13:31
изначально мы инициализируем объект константным значением то значит мы уже его Изменять не сможем например вот функция это уже выдаст нам Exception при этом мы не видим никаких ошибок анализатора То есть он завтра считает все нормально все сработает а потом в рантемы нам скажет упс а вот применение этого оператора константному значению я не смог сделать и вот если где-то далеко-далеко-далеко мы инициализировали константным значениям в другой части кода и забыли про это то это нам может где-нибудь до аукнуться Так что Про это
00:12:53 - 00:14:10
поведение стоит помнить Можем ли мы создать конст объект внутри вас с другими объектами И вообще Можем ли мы их изменять кость поля можно создавать только если вот они имеют приписку Статик вот статическая константное поле Вот и изменять Их уже нельзя то есть мы присвоили коррект вот это 3,14 и уже хотим поменять его значение но так в которых Ну данные сами могут по себе повторяться они имеют индексы и мы получаете можем элементы по индексам сет это множество все элементы в нем уникальные то есть повторяющихся
00:13:31 - 00:14:57
элементов у нас Априори не будет Мы уточним как реализуется эта уникальность но позже Вот и множество как раз таки есть множеством можно работать по-разному и сет при этом реализует дополнительные методы которых нет у листа эти методы позволяют делать например различия пересечения объединения и проводить эти операции более быстро удобно и корректно также операция поиска элемента в сете происходит быстрее и возможно нам зададут об этом вопрос но пока она спрашивает какие есть виды реализации сет у сеты есть три вида
00:15:13 - 00:16:37
реализации на данный момент и дефолтное это linked Z То есть это таблица где сохранена последовательность добавления элементов вот есть просто хэш сет в отличие от linked Shelter linked has Set всего лишь нет последовательности она не сохранена И следовательно в ней нет оператора и также тоже не часто используемый вариант это сплеит ресет потому что это набор объектов который можно упорядочить относительно друг друга и он основан на самобалансирующемся бинарном дереве что позволяет выполнять большинство операций в амортизированном
00:15:55 - 00:17:17
логарифмическом времени и тут вот возникает вопрос Ой а ты вот заметил что-то про время А можешь рассказать э-э За какое время происходит поиск например содержится ли какой-то элемент в листе и сети с помощью например метод контент и тут надо уже вспоминать о симптотическую скорость мы скажем мы разобрались потому что это классика для массивов поиск идет через латен А вот для Сета нужно знать как реализован вообще сет и так как он по сути дела хранит значение в таблице мы уже разобрались в его дефолтном значении
00:16:36 - 00:17:59
linked хэшсет то он хранит эти значения по хешкоду А у каждого объекта в дарте есть свой хэш-код и Значит мы этот хэш-код можем использовать для хранения в сети и если мы вспомним что таблица имеет какое-то тоже определённое значение по скорости то это будет от одного но при этом вот с такой приписочкой тильдой Что означает как раз-таки амортизированное время Вот и считается что можно получить элемент за один шаг но как бы за один шаг так как мы должны помнить что в хэш код Хеш таблицах могут быть коллизии и мы должны хранить именно
00:17:17 - 00:18:51
массив данных по нашему хэшу а уже по массиву поиск у нас идет как раз таки олатен и поэтому чаще всего у нас там симпатическая Скорость она равна единице но по мере увеличения значение в сети она начинает уменьшаться сет же в реализации сплея три сет То есть если мы используем именно эту реализацию он сортирует в себе данные что уже тратит Ну в принципе время которое расходуется на сортировку и происходит бинарный поиск как мы знаем бинарный поиск происходит за от логарифмов вот такой ответ Должен быть на этот вопрос
00:18:06 - 00:19:34
Спрашивается почему же так быстро как я уже ответил Всё дело в хэш-коде и сет его активно используют а при этом мы должны помнить что хешкод может и повторяться это Неудивительно так как мы ограничены интовым значением которые в дарте достаточно большое но все же оно конечно если у нас какой-то интовое значение повторяется в хеш-коде то мы должны как-то отделить два разных объекта с одним и тем же хеш-кодом И для этого используется функция equal которая реализуется тоже У каждого объекта и мы её можем переопределять как их код А вот
00:18:50 - 00:20:13
в реализации спрей сет сравнение идёт как раз таки по функции compertu которая реализуется через интерфейс camerable вот поэтому когда вы будете работать в сравнении с объектом Помните о том что нужно либо переопределять ход иквел либо compare to в зависимости от реализации Чем же отличается хэшмэп и лист когда я увидел этот вопрос я сначала не понял как можно сравнивать вообще мэп и лист Ну если задали так задали то почему бы не ответить конкретно можно сказать что такое linked-лист это связанный список в
00:19:32 - 00:20:55
котором хранится порядок добавления можно взаимодействовать с первым последним элементом то есть связанный список Тут ничего нового классика вот есть возможность получить элемент по индексу но он не наследуется от лист Неудивительно а хэшбэк но это вот как мы уже обсуждали не упорядоченное хеш- таблица Что не является вообще ни в коем разе лист и так как мы уже обсуждали с вами Что такое различие с этой листа А хэшмэп - это по сути дела аналог Сета то нам не составляет труда ответить что отличие хешмыпа от linked-листа в том
00:20:14 - 00:21:33
что оно связано и список а другой хеш- таблица Для чего нужно вообще ключевое слово а вот и обещанный синтаксический сахар Type Dev на самом деле не часто встречается и применяется но он достаточно полезен и в документации к флатеру и к дарту есть маленькая такая приписка что все вот такие синтаксические конструкции синтаксический сахар как мы программисты в сленге его называем желательно не использовать желательно но зачастую это бывает удобно и полезно и для конкретного Type Def которая определяет псевдоним позволяющий
00:20:53 - 00:22:18
скрывать какое-то определённый тип конкретный своим собственным значением вот int у нас был айтишники у нас были как интовые значения А мы предполагаем что они могут поменяться например на стринг в любой момент потому что у нас есть например guid вот то мы можем скрыть это значение под нашим тайм-дефа и применять его в коде где захотим Чтобы потом если что быстренько это все поменять либо очень-очень длинный тип зачастую Мы очень прям нередко используем вот эту конструкцию во флатере потому что колбэки передавать
00:21:36 - 00:22:59
очень много приходится и вот эту конструкцию в материям Насколько помню библиотеки изменили на вот колбек писать быстрее проще экономит время и удобно понятно что обозначает Вот для этого как раз таки используется слово ключевой тайп деф прохеш код и шкот в принципе мы уже говорили где он применяется но интервью вспоминает А что вообще такое Это хешкот вот ты говоришь код хэш кот чем вот отличается например от адреса памяти вот хэш-код он определяется у каждого объекта и это числовой его идентификатор по которому который
00:22:16 - 00:23:38
представляет состояние объекта То есть он зачастую берет поля объекта и конвертирует в его снимок вот этот снимок и есть числовой идентификатор и состояние может быть одинаковым как я уже говорил из-за того что ну во-первых состояние объектов может быть одинаковым и хэш-код у нас ограничен размерностью винта они могут повторяться А вот адрес у объекта всегда разный В чем же дело на самом деле у Дарта объекты хранятся динамически то есть мы не можем мы можем на самом деле получить как-то извернуться адрес нашего объекта но он
00:22:58 - 00:24:22
бесполезен Откровенно говоря потому что сборщик мусора удар-то вот активно перемещает объекты и мы получаем их с помощью определённых э хендлеров и этот адрес фактически для нас бесполезен но также стоит упомянуть помимо адреса памяти и хэ откуда есть еще такой хэш-код отдельный как identity хешкод и это тот же самый хэш-код который присваивается всем объектам но с одной оговорочкой Если мы с вами решим переопределить Hash код например для того чтобы в сете у нас хранились элементы правильно правильном порядке то
00:23:40 - 00:25:05
мы можем потерять этот старый хэш-код А вдруг он нам для чего-то нужен То есть в какой-то момент всё-таки стоит отделить объекты именно конкретно по хешкоду который был сделан э-э на основе ссылки и этот хэш-код вычисляет хэш по ссылке на объект и независим от этого переопределениях Шкода То есть вы можете одновременно и определять хеш-код имеет свой собственный хэш-код и при этом с помощью функции identity хэш-код иметь хешкод основанный на ссылке Тогда вопрос возникает Зачем вообще переопределять мы обсудили Да а вот как
00:24:22 - 00:25:41
переопределять hashcode перепределить не сложно это у нас int значение и мы в принципе можем туда передавать любое значение но советуется по документации использовать вот эту конструкцию object Hash или вариации его вариации его название там Хеш олл и прочее Ну и конечно же нужно Если вы переопределяете хош-код обязательно перепределите иквал повторяться не хочу хэш-код повторяется можешь повторяться поэтому определять тоже обязательно Ну вот как один из примеров Как вы можете переопределить equal у вас там может
00:25:02 - 00:26:23
быть какая-то определенная логика но чаще всего используется функция дентика которая сравнивает два объекта По ссылкам которые на которой ссылаются эти на которые ссылаются объекты вот это текущий объект и другой с которым сравнивается или же если у нас все-таки ссылочная проверка прошла удачно то нужно удостовериться что типы сходятся то есть нам не прислали какой-то левой там объект и наши поля Каждый каждый из полей то есть мы вот здесь определяем каждый из полей тоже является одним и тем же объектом это вот прямо
00:25:43 - 00:27:02
основательная проверка глубокая на то что этот объект точно такой же как и мы получили на проверку То есть он прямо тот же самый и вопрос в зал Почему переопределяется их код и equal я отвечал Сейчас проверю на вашу внимательность но ладно если предположение нет то опять же повторюсь где мы хэш-код используем зачастую мы используем его в хэшмэп и так как у нас хэш-код он ограничен значение мента у нас там 64 байта по моему идет на int то в рамках вот этих вот этого значения оно достаточно большое там что-то больше
00:26:22 - 00:27:59
по-моему миллиарды или что-то в этом роде не сильно запоминал вот значение но оно такое основательное и все-таки повторение могут быть и вот с этими повторениями надо как-то бороться А как бороться когда у нас в принципе два разных объекта А хэш-код у них одинаковый для этого надо перепределить и Кого Ну вот такой ответ вот Он представил как раз на слайде Как происходит вообще сравнение идентиков Здесь тоже стоит пояснить я уже говорил что это ссылочное равенство указатель на один и тот же инстанс а но здесь Надо
00:27:10 - 00:28:23
разобрать пример вот у нас есть лист вроде бы одинаковые значения у него и мы присвоили к третьему листу значение первого Но на самом деле ссылку передали на лист третий и вот Давайте сравнивать теперь идентичные или у нас хранятся объекты посылочно а идентика вот сравнивает первый второй и говорит Да так а вот а вот интересно здесь вот правда написано или нет Как вы думаете должно быть нет потому что ссылка та же самая должна быть да Да скорее всего здесь идёт ошибка а-а Ну мы скорее всего вернёмся к этому моменту в конце и
00:27:47 - 00:29:01
проверим чисто на компиляторе Но насколько я помню два разных объекта вот здесь не должно быть тру здесь должно быть false потому что два разных объекта у нас а-а создаются имеют две разные ссылки Пускай один и тот же контент Но это две разные ссылки А вот здесь а идентикл должен быть так как это один и тот же объект по ссылке так по поводу винтов то есть мы здесь с вами осуждали объекты Да это не встроенные типы которые имеют ссылочную передаваемость а вот здесь уже идут константные значения то есть один
00:28:24 - 00:29:39
это int а intv значения именно значение единица оно в дарте определяется как Константа и поэтому когда мы делаем identical 1.1 то у нас при сравнении идет True и что стоит отметить сравнение именно такое по значению не по ссылке А по значению у а идентикл только для интовых типов и для дабл типов это намеренное исключение потому что их значение является канонизированным то есть оно является константным вот все остальные же элементы которые не дабленин они сравниваются по ссылке Так что надо помнить когда вот вы одентиков
00:29:01 - 00:30:30
сравниваете вы сравниваете у интаил даблу значения а не их ссылки то есть вот такой нюанс уйдентика есть если вы скажете это про этот нюанс интервью вы его достаточно сильно Удивите но тем что вы осведомлены о такой особенности Можно ли в Дарт использовать множественное наследование вот мы как раз уже приближаемся к теме наследства Что же нам достанется что ж будет привычном смысле можно сказать что множественное наслед наследование сделать нельзя вот а наследовать сразу от нескольких родителей конечно же тоже язык не
00:29:46 - 00:30:56
позволит Вот Но есть непривычный смысл которым мы обсудим позже Если есть то с помощью чего Тот сразу вопрос возникает с помощью миссис Но кто-то это считает множественным наследованием кто-то нет но так как миксенс это является примесью то не стоит считать множественным наследованием так это равноправное наследование не даже не наследование просто равноправнее подмешивание идет к элементам и тут же возникает вопрос Вот ты упомянул мексин А что это вообще такое Приведи пример примеси Как переводится миксе они нужны для
00:30:21 - 00:31:38
расширения функционал класса и максимум может быть не только не только Объект который мы описали как миксен то есть ключевое слово да но и сам Класс вообще любой класс миксер мы его можем перемешивать к другому классу Стоит ли это делать или нет тут ситуация разные но зачастую лучше написать отдельный миксер вот Могут ли быть описаны поля и методы А вот подмешивание происходит с помощью увы и порядок подмешивания миксенов идёт с конца То есть если вы Может вы можете подмешивать безграничное количество миксеров но применение этого
00:30:59 - 00:32:19
подмешивания оно будет идти с конца списка То есть это вот важный нюанс который нужно помнить при применении миксенов вот Приведите пример этих миксеров но я вспомнил сразу же сингл тикер провайдер stepmixen который используется для анимаций у State for виджета и он предоставляет одному анимешн-контроллеру тикер и получает свойства в Синг которая позволяет анимациям отрисовываться плавно аудитория моя и те кто в зале Какие ещё пример Вы можете привести максимум который вы когда-то использовали или
00:31:39 - 00:32:59
видели я делал для стейта для того чтобы можно было едино логику для экранов использовать обновлении Круто у кого-то еще есть примеры да по-моему Или вроде бы обстоит или виджет бензинг по-моему актера так [музыка] виджет биньяк абсервер который позволяет определять состояние приложения скрыто оно или нет приостановлено и так далее да с миксельными почти разобрались и стоят уточнить некоторые нюансы Может ли миксе наследоваться другого класса Может ли миксер иметь конструктор Можем ли мы создавать экземпляр миксина вот к вам
00:32:19 - 00:33:39
опять-таки вопрос Да верно Ничего из этого нельзя делать так как миксер это миксе на класс Можно ли использовать extendods нескольким классами но как я сказал Множественные наследование запрещено Если бы у вас было несколько родителей биологических это было бы странно именно одного пола Поэтому экстент с нескольким классами тоже выглядит странно если Посмотреть например на дерево то это невозможно иметь нескольких предков сразу вот поэтому нельзя наследовать сразу от нескольких родителей можно расширять только одного если в
00:33:03 - 00:34:19
интерфейсе вот здесь интересный вопрос Если у вас на это ответ они просто особенные Ну это можно использовать абстрактные классы на самом деле интерфейс может быть любой класс поэтому в дарте интерфейсы есть потому что любой класс и при реализации нужно просто переопределить все поля и методы этого класса Но что интересно такой факт исторический 2012 году был вот такой ключевое слово интерфейс в дарте ну его впоследствии убрали то есть оно перестало быть нужным так как любой класс может быть интерфейсом вот Можем
00:33:41 - 00:34:57
ли мы им лимитировать обычный класс Ну так как я сказал что любой класс является интерфейсом то конечно можем переопределили все методы и поля и работаем но вот нет нет не всегда Как видите пример такой у нас есть как раз таки вот абстрактный класс который мы можем имплементировать да и перепределить его метод нужно есть класс просто класса у которого тоже есть метод бил Но что тут Важно отметить это возвращаемые типы то есть сигнатура нашего метода тут у нас дилемма надо какую-то сигнатуру выбрать а никакую
00:34:19 - 00:35:38
сигнатуру выбрать по сути дела и нельзя так как нужно реализовать И то и другое и получается конфликт Поэтому в дарте есть проблема с наименованиями то есть наименование повторяться не могут с разной сигнатуры если бы одинаково сигнатуру то еще прокатило бы я удивился но прокатило бы да а вот с разными названиями с разной сигнатуры не прокатывается поэтому каждый раз задумывать про название методов они могут повлиять на в будущем на разработку такой нюанс Что такое абстрактный класс и Можем ли создать
00:34:59 - 00:36:15
экземпляр абстрактного класса но сразу тот ответ вылез нет Что конкретно про вообще абстрактный класс это класс схема для описания полей моделей То есть это фактически является как Ярослав сказал По моему интерфейсом и все эти поля и методы нужно будет переопределить при реализации Для чего нужно абстракт для полей классов В чем отличие от страха отлей вот меня иногда удивляет вопросы такие языковые листы которые задают на собеседование они пытаются вести себя в заблуждение то есть думаю а вот отличить ли ты абстракт от лейт но
00:35:37 - 00:37:04
здесь достаточно Все просто если ты знаешь что такое абстракт и абстрактный лейт но удивляет то что нам дают цвет и вкус нужен абстракт для описания полей которые точно должны быть переопределены Наследники именно мы поля абстрактными называем для этого А вот лэйд этого ленивые или отложенная инициализация и от абстрактного класса Она даже не зависит ее можно применять вот от слова Ключевое late в любом месте инициализации на нашей переменной сходство и отличие у абстрактного класса и максимум Ну расширение функционала
00:36:20 - 00:37:43
конечно же возможность описывать методы и поля наследовать их реализацию но так как логика у обоих разные все-таки абстрактный класс это класс схема является она большая частью Над нашим объектом Над нашим реализующим классом она указывающим перстом показывает что нужно сделать и как Амиксин - это перемешивание то есть оно является на одном уровне с классом и фактически имеет Доступ к его полям и методам что позволяет в миксене удобно всё настраивать здесь и повторять дополнительную логику на основе уже
00:37:01 - 00:38:32
класса не создавая при этом интерфейса а что же такое extension опять сахарочку немножко в наш разговор Для чего он вообще нужен как я говорил extension не советуется создавать именно по гайд-стайлу код стайл но все же иногда без экстеншинов не обойтись и они советуют для того чтобы реализовывать нужные методы внутри класса а не в каких-то Вот таких экшенных которые способны расширить функционал класса без нанесения какие-то изменения в него Но если вы имеете доступ к классу то почему бы не реализовать функционал в самом
00:37:47 - 00:39:11
классе зачем вам экшен Ну бывает случай когда без него не обойтись потому что например нет доступа к классу Да он встроенный какой-то встроенный тип встроенный махиет или класс находится где-то вообще вне пакета приложения Да и мы прямого доступа к его начинке не имеем но при этом мы можем сделать такое вот расширение которое позволяет нам ко всем методам применять ко всем значениям этой нашей перемены применять наши новоявленная функция наш новоявленной функции новоявленный метод Вот и такой вот примерчик у нас есть
00:38:29 - 00:39:56
слово Победа и мне хочется каждый раз собирать первую букву Как вы видите у меня это получилось вот она превратилась в букву А еда да беда Вот и каждый раз я знаю что вот у стринга нет этого метода то я каждый раз могу применять метод новый которого не был в реализации string к нашему значению и это будет у всех значений STR переменных в любом месте кода у стринга точно будет этот метод того что я его дополнительно реализовал расширил вот в этом пользе как раз extension of доступы прямого к старингу нет
00:39:12 - 00:40:38
используем extension Нет проблем На этот ну вот вообще Вот Все Все на этом матч наш закончен но он был первым так как это была первая Дарт часть в дарте еще куча вопросов осталось и поэтому если вам было интересно Если вы используете это видео как памятку для будущих своих собеседований то Пишите в комментариях ждете ли вы еще одну такую же памятку чтобы потом повторять это перед собеседованиями и возможно будет новая часть Спасибо за внимание
00:39:55 - 00:41:07