По теме ) . # Полиморфизм -- это возможность одного и того же алгоритма обрабатывать данные разных типов, независимо от того, какие это типы. Без проверок типов внутри и ветвления в зависимости от того, с каким конкретным типом алгоритм работает в конкретный момент времени. . # Мнимый полиморфизм (ad-hoc) -- это когда только создается видимость, что алгоритм полиморфный, но на самом деле в момент компиляции/транспайлинга программы либо происходит подстановка другого алгоритма, в зависимости от типа/ов переданных аргументов, либо происходит неявное преобразование типа/ов аргумента/ов. Важно то, что в результате есть один или больше алгоритмов, каждый из которых мономорфный -- т.е. работает с данными строго одного типа. Ярким примером является перегрузка функций/методов. Когда для обработки разных данных создаются разные функции, имеющие одно имя, но разную сигнатуру (имя + перечень типов аргументов). Такое возможно далеко не во всех языках программирования. . К такому типу полиморфизма относится и паттерн-матчинг, т.к. он сводится к совокупности мономорфных алгоритмов. . По способу достижения полиморфизма можно выделить: - полмиорфизм подтипов - структурный полиморфизм - параметрический полиморфизм . # Полиморфизм подтипов - это возможность алгоритма работать со всеми подтипами одного общего типа, опираясь на свойства общего типа (например, на то, что экземпляры общего типа, а значит и всех его подтипом, имеют определенный метод, с определенной сигнатурой). Наследование -- это частный случай создания Подтипа. Определяя интерфейс, создается тип. Реализация интерфейса -- это также создаение Подтипа, хоть наследование и не происходит. TypeScript и Flow работают именно с таким типом Полиморфизма, даже не смотря на то, что проверка того, является ли Тип подтипом Общего Типа осуществляется путем сопоставления структур Типа и Общего типа (без необходимости синтаксически декларировать такую связь). . # Структурный полиморфизм - это возможность алгоритма работать с объектами (значениями), игнорируя их тип и способ создания, и предполагая, что объекты/значения обладают нужными свойствами (например у объектов будет нужный метод с нужной сигнатурой). Его часто называют Утинным Полиморфизмом. Такой работат в JS. Собственно, я бы Структурный полиморфизм отнес к разновидностям Полиморфизма подтипов, но с оговоркой, что статической проверки типов нет. . # Параметрический полиморфизм -- это возможность алгоритма работать с данными "не названных" типов, которым присвоены абстрактные имена. Т.е. типы являются Параметрами алгоритма, равно, как и его аргументы. Это всеми нами гороче любимые Generic-и. Например: Array -- это пример Параметрического полиморфизма. Tree, List etc. etc.
Только утиная типизацияи структурная типизация это не одно и то же. Например, автоматическую реализацию интерфейсов в Го некорректно называть утиной типизацией.
@@haykmkrtchyan7093 думаю, это зависит от языка и от дженерика. Например, в TS на тип-параметр можно наложить органичение: соответствовать какому-либо интерфейсу и тогда все пойдет по полиморфизму подтипов. А может и зарезолвится в ad-hoc полиморфизм -- если это например: f = (a: T, b: T): T => a + b; В общем, параметрический полиморфизм -- это круто, полезно и вкусно.
Спасибо! Я из тех кому все равно на фон, звук, одежду и прочее. Содержание - Самое главное! Спасибо за содержание! P.S. Мне во всех ваших видео нравится антураж
Ой, сколько новых видео!!! Сергей, ставлю лайк даже не посмотрев (сейчас исправлю эту ошибку), так сказать заочно! Большое вам спасибо! Долго отсутствовал, сейчас буду смотреть каждое новое для меня видео.
Блин. А про if-то мысль реально хороша. Объяснение полиморфизма через нее пока самое доступное на моей памяти. Было бы круто добавить короткий пример замены if-а или оставить ссылку на него.
Да сложно представить истинный полиморфизм заменяющий IFы без перегрузки или нарушения инкапсуляции - первого принципа ООП. Разве только приходит в голову методика разыменования аргумента в метод базового класса или что-то подобное! ПС: Возможно перегрузка методов-интерфейса хороший вариант решения данной проблемы и я так понимаю что это не будет считаться как ad-hoc полиморфизм.
В видео было много слов, но, к сожалению, некоторые из них правильные, а некоторые - нет. В итоге складывается впечатление, что полиморфизма всего два, и из них один какой-то неправильный (ad-hoc). Что лишний раз подтверждает тезис, что практика без теории __слепа__. Ниже определение полиморфизма более-менее соответствующее теории. Полиморфная переменная -- это переменная, которая может принимать значения разных типов данных. Полиморфная функция -- это функция, у которой хотя бы один аргумент является полиморфной переменной (не забываем о методах, которые суть функции, и у которых есть неявный первый параметр this). Полиморфная функция бывает двух видов. Ad-hoc полиморфизм - когда функция ведет себя по разному для аргументов разных типов. Функция "нарисовать" - рисует по разному разные геометрические фигуры. Параметрический полиморфизм - когда функция ведет себя одинаково для аргументов разных типов, нет информации о настоящем типе и значение любого типа может быть передано в качестве аргумента. Пример - функция "положить элемент в контейнер". Заметим, что subtype полиморфизм (который в ООП называют просто полиморфизмом, когда вместо ссылки на базовый класс можно передать ссылку на производный) __НЕ__ является параметрическим полиморфизмом, потому что тип известен (тип базового класса). Иногда выделяют статический и динамический полиморфизм - когда тип разрешается во время компиляции, или во время выполнения. Теперь можно рассмотреть частные случаи: 1. _Преобразование чисел_, когда функция принимает double, туда иногда можно передать целые числа и float, этот вид полиморфизма часто называют automatic coerce, в разных языках делается по-разному, скажем в OCaml его вообще нет и нужны явные преобразования. 2. _Перегрузка функций_, когда одно имя функции используется для аргументов разных типов и количества аргументов. Используется в постпроцедурных ОО языках, таких как С++, Java, C#. В функциональных языках отсутствует, поскольку ломает вывод типов (впрочем в Haskell нетрудно сделать аналог перегрузки). 3. _Параметрический полиморфизм_, когда функция получает тип (или несколько типов в качестве параметров), например `foo(a: T): T` - функция имеет один параметр-тип и один полиморфный параметр, который связан с этим типом. Такой полиморфизм известен под именем generics, и присутствует под этим именем в Java, Kotlin, C#, Scala и может быть в будущем Go :-) Почему в Scala этот вид полиморфизма значительно мощнее? Потому что на параметры-типы можно накладывать очень детальные ограничения, например: def lift[F[_]: Functor]: F[A] => F[B] здесь на параметр F накладывается ограничение, что F - это тип с параметром, и подтип типа Functor (который тоже параметризован, но это можно узнать посмотрев его определение). В Haskell (или ещё более далёком от мейнстрима Idris) ограничения на типы могут быть ещё более детальные, и сами параметры-типы можно связать ограничениями, и это всё позволяет отсеивать компилятором огромное количество ошибок. Таким образом, ограничения позволяют прокинуть мостик между параметрическим и ad-hoc полиморфизмом и выбирать какой-то нужный вам баланс. Впервые большой шаг к этом сделал Филипп Вадлер в работе "How to make ad-hoc polymorphism less ad hoc" users.csc.calpoly.edu/~akeen/courses/csc530/references/wadler.pdf 4. Наконец _полиморфизм подтипа_ - это вид ad-hoc полиморфизма, когда первый неявный параметр this имеет тип базового класса, диспетчеризация происходит в рантайме, обычно с помощью VTable. С точки зрения теории довольно слабый вид полиморфизма, поскольку ограничение на тип лишь одно, типом базового класса снизу. Естественно, делает невозможным точный вывод типов, не позволяет диспетчеризоваться по нескольким типам параметров, и по типу возвращаемого значения, вынуждает делать нетипобезопасные преобразования (т.н. downcasting). 5. Также есть ещё row polymorphism, когда селектор поля, например .user в разных записях может выступать как самостоятельное значение, передаваться в параметры и использоваться в полиморфных контекстах, а будучи применённый к разным значениям, скажем account и book возвращает соответственно account.user и book.user. Чем-то напоминает структурные типы, но гибче. 6. Есть ещё много других, таких как family polimorphism, но это уже глубины теории типов, до практики они ещё не дошли. Итог. Сергей Немчинский конечно хороший дядечка, позитивный и харизматичный, но не стоит верить всему, что он говорит без оглядки, нужно проверять сведения и читать хорошие книжки, скажем Пирса "Типы в языках программирования".
Спасибо что успакоели меня (Scala кодера) а то прям кровь из ушей лилась. Думал сам закаментировать но решил сначала адекватный коммент поискать. Ещё + вам в догонку.
Сергію, дякую! Не додам нічого нового до того, що сказано іншими, просто урок вийшов традиційно змістовним і цікавим і заслуговує на "свіжий" коментар))
Sergey, плакал в голосину, когда узнал, что не я один отделением состояния от поведения озадачен. Пробовал даже чинить подобное упущение, добавляя для каждого сервиса-интерфейса(со свеой иерархией) "сервис-маршрутизатор"(не знаю как иначе назвать), который, в зависимости от получаемой имплементации доменной сущности(с общим интерфейсом) делегирует соответствующему обработчику(ну и результаты мержит).
Не хватает зарисовочек на белом фоне, чтобы визуально было понятно на примере, а так как радио послушал, но в целом как всегда супер;) спасибо за видео
Вы молодец. Достаточно давно слежу за вашим каналом. Даже 2 месяца был на проекте в вашей школе. Надеюсь, даже спустя неделю, вы прочитаете этот коммент. Хотелось бы и мне высказать свое мнение по поводу видео, хотя обычно комменты не оставляю. С фоном лампово и по домашнему, без фона - динамически и по современному. Больше всего понравились тезисные подпись. С ними как-то проще воспринимается информация. Можно подписи оставить (пофиг на фон))
Хорошее видео. Кстати про абстракцию согласен, масло масленое. Абстракция есть отказ от неких свойств объекта, которые не важны в контексте решаемой задачи. Это вообще используется в любой области жизни. Если я нанимаю строителя, чтобы он делал ремонт, мне важно умеет ли он красить, класть плитку, штукатурить и совершенно пофигу умеет ли он играть на балалайке.
Не всегда нужно использовать наследование для достижения параметрического полиморфизма. Есть языки, в которых импелементация интерфейсов не требует наследования (Rust, Go, Typescript). Есть дженерики и темплейты. Есть Duck Typing и динамические языки. Конечно, это не значит, что не нужно использовать наследование, но его ограниченность нужно понимать и стараться избегать.
Новый формат супер! Все внимание фокусируется о том, что говорит диктор☝🏻 Возможно, для лучшего понимания полиморфизма можно было бы добавить несложные схемы или код, чтоб акустическся информация еще визуально подкреплялась. Сергей, спасибо Вам!
По моему опыту, это наиболее полное и понятное объяснение полиморфизма на русской ютубе. И за инфу про объекты без поведения и сервисы без состояния отдельное спасибо, это действительно имеет место быть и на это стоит акцентировать внимание, чтобы понимать современные реалии проектирования ПО.
Хороший эксперимент с фоном. За столом было душевнее. Но с белым фотом можно выводить дополнительную информацию. Единственное я бы добавил больше информации. И когда она появляется, сдвигал спикера больше в бок
разделение видео на части - хорошая идея. Использовать для этого пятисекундные вставки с логотипом выглядит растягиванием хронометража. Они одинаковые и скучные. Можно хотя бы названия этих частей туда вставлять
спасибо очень интересно. Побольше информации для чайников от архитектора как устроен компьютер интернет сайты и серверы.. читаешь порой вакансии и запутаешься в терминах разжуйте пожалуйста в видео вакансии с hh.ru например думаю многим будет интересно:" Минимум 2 года опыта коммерческой разработки ПО. Хорошее знание теор. минимума computer science. Хорошее владение языком Java, опыт серверной разработки на нем. Знания и опыт многопоточного программирования. Знакомство с JavaScript, опыт разработки браузерных приложений Опыт работы с Java 8 Знакомство с продуктами Atlassian. Знакомство с функциональными языками программирования, FRP. Писать unit-тесты, в отдельных случаях - интеграционные тесты. Structure - Atlassian SDK, Java, REST, JavaScript, jQuery, HTML5. Рабочее окружение - IntelliJ IDEA, Git, Maven, TeamCity, BitBucket Server, Docker. Тесты серверного кода пишутся на Groovy / Spock, клиентского - на JavaScript / QUnit. Мы широко используем Structure новый важный функционал покрывается unit-тестами; Code Review у нас обязателен для каждого изменения; подробное ручное тестирование готовых сборок.
С напряжением смотрел видео, ожидая, когда же ты начнёшь как обычно "гы-гы" впопад и невпопад. НО ЭТОГО НЕ ПРОИЗОШЛО!!! Прям видно, как нелегко тебе это давалось! Но ты смог! Респект и уважуха!!! 👍🏻👍🏻👍🏻😂 Так гораздо представительнее и производит лучшее впечатление. Признаюсь, эти постоянные гы-гы раздражают, но может это проблема во мне 😂 Новый формат определённо имеет право на существование, но и старый оставить тоже было бы неплохо. Возможно, стоит выбирать формат в зависимости от темы. Согласен с другими комментаторами на тему звука (эхо) и притянутых за уши вставок-заставок. Если бы меня попросили выбрать лишь один формат из двух, то пока что старый побеждает. Но ИМХО пока ещё рано делать выводы. После пяти-десяти роликов в новом формате понятнее будет. Спасибо за интересный канал 👍🏻
Сергей, здраствуйте.... бил би очень благодарен за какой нибудь конкретний пример замени if полиморфизмом, или если у вас есть уже такое видео, то буду благодарен за линку, а то чтото никак в голове такой код не виресовуется.... Спасибо
Есть вопрос по поводу применения вставок с помощью JNI. Кроме самого логичного кейса использования сишных и ассемблерных вставок в Android приложениях, это вообще имеет место быть? Просто это рушит весь принцип jvm и тд. Какие кейсы использования можете привести?
Отсутствие хранимого состояния, позволяет относительно легко горизонтально масштабироваться, сравнительно легко тестировать части, и легко дебажить. Самое сложное для понимания это state machine, чем является по сути любой объект в ООП. Из за этого, куча фреймворков и принуждает разделять хранение и обработку. Век вертикального масштабирования, сменяется горизонтальным и пора бы переходить на функциональщину.
Сергей, запишите видео почему вы перешли с C++ на Java. Я постигаю плюсы, очень нравится, но очень сложно=), потому крайне хотелось бы послушать вас. Благодарю!
самый топовый канал. Немного музычка отвлекает на фоне Благодарю за информацию . Поздравляю скоро 100 000 подписчиков . У меня не большой канал но тоже стараюсь для начинающих в айти делать хорошие видео . Если что заглядывайте надеюсь понравится я очень стараюсь .
Где-то слышал что полиморфизм это когда объект подкласса можно использовать вместо объекта родительского класса. Например есть класс Person и производный от него класс Student, объект класса Student имеет 2 формы, он является и человеком и студентом
Кажется вы перепутали Parametric polymorphism (параметрийчний полиморфизм - на нем построены дженерики) с Subtype polymorphism (полиформизм на основе подтипов).
Лично я полиморфизм понимаю так: есть полиморфизм с точки зрения перегруженных (overload) методов и переопределенных (override). Полиморфизм для перегруженных методов - не более чем "синтаксический сахар", т.к. в ООП функции однозначно идентифицируются по имени и по формату входных параметров (их тип и количество), то для удобства написания кода разработчику стоит помнить только одно название метода, а конкретная функция по данному имени будет выбрана уже компилятором на основе формата входных данных и встроена в код. А полиморфизм для переопределенных методов - это т.н. "динамическая диспетчеризация методов", которая работает во время исполнения программы, вызов конкретной реализации функции зависит от типа определенного объекта, а не типа ссылки объекта. Но тип ссылки объекта будет определять интерфейс взаимодействия с этим объектом. И в этом случае полиморфизм дает большие преимущества - вызываемой среде (какому-нибудь фреймворку, например) не нужно ничего знать об реализации объектов-наследников, если он уже знает интерфейс взаимодействия с объектом. И в байт-коде (если это Java) нет "жесткой" связи с функцией, которая должна вызываться, и JVM во время работы программы ищет реализацию конкретной функции для конкретного объекта, который реализует интерфейс. Это позволяет, например, приложениям на Android динамически устанавливаться и запускаться без необходимости перекомпилировать фреймворк (базовую jvm-программу) Андроида (статически "встраивая" в него код приложения и жестко прописывая идентификаторы реализуемых функций), без перезагрузки и прочей дичи. Системе (исполняемой среде машины) ничего может быть неизвестно о собственных классах приложения и как с ними работать напрямую, но при этом знает, как взаимодействовать с известными ему базовыми классами (интерфейсами), унаследованными/имплементированными из фреймворка. Именно такой полиморфизм позволяет быть фреймворку и приложению - отдельными модулями в одной исполняемой среде. У меня примерно такое понимание складывается, сам изучаю Java по книге Шилдта. И лично мне всегда казалось, что полиморфизм (с практической точки зрения, а не абстрактной теории) - это только про переопределяемые методы, который существует только в ООП. А перегрузка - это просто иной способ однозначной идентификации функции по тому же имени, но с разным форматом входных данных, которая, в теории, вполне могла бы существовать и в ФП.
Сергей, отличный формат, но мне кажется слишком много наездов/увеличения камеры и возможно лучше использовать текст либо при наезде либо нет) Спасибо за видео
вряд ли, в случае наследования, колесо истории повернет ход, на самом деле все движется к функциональщине и ООП отодвигается все дальше и дальше, а куча кода построенного на инверсиях и инъекциях без наследования вряд-ли будут переписывать по новой, да и плюсов у такого подхода тоже не мало.
а как же тогда реализовать многочисленно ветвящиеся проверки?! я начинающий программист(только не на джаве), вот я написал портянку из этих if'ов. неудобная она, понятно.. а ещё дописать много надо в неё же(логика сложная). как её перестроить в объекты? все условия разные...
Согласен с предыдущими комментариями про белый фон и ламповость. По поводу видео: про полиморфизм после видео понятнее не стало. Наверно, словами такое не объяснить, нужны примеры кода
Наследование - это да. А как же интерфейсы? Можно вместо базового класса использовать интерфейс. И тогда метод может принимать любой класс реализующий этот интерфейс.
Спасибо за материал.. но музыкальная подложка все портит.. Получается что музыка на фоне отвлекает от повествования... как будто в шумной кафешки сидишь...
Достаточно сумбурно и узко. . По ссылке все разложено гораздо лучше: en.wikipedia.org/wiki/Polymorphism_(computer_science) . По лекции. "Полиморфизм не возможен без наследования". Возможен, если есть интерфйсы. Интерфейсы реализовывають, а не наследуют. Кроме того, возможен структурный полиморфизм (см. JS), при котором происходит реализация интерфейса без явного декларирования обязательства его реализовать. . Что касается наследования и полиморфизма. Ноги здесь растут из С++-ных чисто-абстрактных классов, которые играют роль интерфейсов и там реализация интерфейса синтаксически декларируется, как наследование. Вместе с тем, если класс действительно чисто абстрактный, то никакого наследования не происходит (наследовать нечего). К тому же, это конкретная реализация, в конкретном языке программирования (ЯП). Если же ЯП допускает указние интерфейса в качетсве типа аргумента функции/метода, то полиморфизм возможен и без наследования. Более того, именно такая форма полиморфизма и рекомендована D-принципом из SOLID. . А вот с параметрическим полиморфизмом вообще незадача вышла. Во-первых, описанное в лекции больше подходит под "Полиморфизм Подтипов" en.wikipedia.org/wiki/Subtyping . А во-вторых, Параметречиский полиморфизм -- это возможность создать целый класс классов (типов)/функций, имеющих общую реализацию, независимо от того, на какие типы опирается каждый/ая конкретный/ая из них. Это вот совсем не полиморфизм подтипов. Например, у нас есть такое понятие как матрица, матрицы можно складывать, умножать на число, на другую матрицу, можно находить обратную матрицу, и соответственно можно даже делить одну матрицу на другую (умножать на обратную). . Так, вот можно реализовать класс Matrix, который будет это все делать, скажем, для целых чисел, можно сделать тоже самое для вещественных, комплексных и т.п. Но, все эти алгоритмы будут одними и теми же. Так родились шаблоны в C++ и Generic-и в Ява (C#, TypeScript и большом числе других языков). . class Matrix { // ... } . это и есть пример параметрического полиморфизма. Собственно: Array -- это тоже пример параметрического полиморфизма. Класс работает для любых типов T, даже не связанных наследованием и даже не требующих реализации специфического интерфейса (в случае с матрицами там на параметрический тип Т накладывается ограничение, т.к. требуется, что для значений из него были реализованы определенные операции, определена единица, ноль и т.п.). Параметрический полиморфизм -- это программирование на типах (создание функций, которые на вход получают типы, и на выходе имеют типы). . И все это ну никак с наследованием не связано. Т.е. оно может существовать параллельно с наследованием, т.к. вполне себе можно унаследоваться от Generic типа. . Ну и еще, на полиморфизм можно посмотреть с другой стороны, т.е. не только со стороны полиморфного алгоритма, но и со стороны полиморфного класса. Скажем, если некий класс реализовывает несколько интерфейсов, то его вполне себе можно назвать полиморфным (скажем, интерфейс серрилазиации/десерриализации и интерфейс инспектирования). Но, отсылки к такому типу полиморфизма редки и, вряд ли, существенны.
а мне наоборот, всегда было непонятно, почему никто никогда не говорит о том, что if-ы - это по сути альтернатива полиморфизму. Ведь if это как раз об этом - проверить что-то, что в принципе может быть разделено на 2 (или более, если с else) класса с общим предком, в котором, так сказать, описан весь тот контекст, в котором мы работаем
Эхо сильное, а так формат хороший :)только в старом формате было прикольно наблюдать за новыми вещами на столе и в фоне... Так через интерфейсы реализуется полиморфизм...зачем наследование 🙄
🦊Новый поток Advanced курса Enterprise Patterns стартует уже 1 февраля 2023 года ❗
Регистрация - go.foxminded.ua/3GPXeYF
Ценю работу над каналом, но поддержу мнение, что за столом было душевшее) И эхо в этой студии сильное
По теме )
.
# Полиморфизм -- это возможность одного и того же алгоритма обрабатывать данные разных типов, независимо от того, какие это типы. Без проверок типов внутри и ветвления в зависимости от того, с каким конкретным типом алгоритм работает в конкретный момент времени.
.
# Мнимый полиморфизм (ad-hoc) -- это когда только создается видимость, что алгоритм полиморфный, но на самом деле в момент компиляции/транспайлинга программы либо происходит подстановка другого алгоритма, в зависимости от типа/ов переданных аргументов, либо происходит неявное преобразование типа/ов аргумента/ов. Важно то, что в результате есть один или больше алгоритмов, каждый из которых мономорфный -- т.е. работает с данными строго одного типа. Ярким примером является перегрузка функций/методов. Когда для обработки разных данных создаются разные функции, имеющие одно имя, но разную сигнатуру (имя + перечень типов аргументов). Такое возможно далеко не во всех языках программирования.
.
К такому типу полиморфизма относится и паттерн-матчинг, т.к. он сводится к совокупности мономорфных алгоритмов.
.
По способу достижения полиморфизма можно выделить:
- полмиорфизм подтипов
- структурный полиморфизм
- параметрический полиморфизм
.
# Полиморфизм подтипов - это возможность алгоритма работать со всеми подтипами одного общего типа, опираясь на свойства общего типа (например, на то, что экземпляры общего типа, а значит и всех его подтипом, имеют определенный метод, с определенной сигнатурой). Наследование -- это частный случай создания Подтипа. Определяя интерфейс, создается тип. Реализация интерфейса -- это также создаение Подтипа, хоть наследование и не происходит.
TypeScript и Flow работают именно с таким типом Полиморфизма, даже не смотря на то, что проверка того, является ли Тип подтипом Общего Типа осуществляется путем сопоставления структур Типа и Общего типа (без необходимости синтаксически декларировать такую связь).
.
# Структурный полиморфизм - это возможность алгоритма работать с объектами (значениями), игнорируя их тип и способ создания, и предполагая, что объекты/значения обладают нужными свойствами (например у объектов будет нужный метод с нужной сигнатурой). Его часто называют Утинным Полиморфизмом. Такой работат в JS. Собственно, я бы Структурный полиморфизм отнес к разновидностям Полиморфизма подтипов, но с оговоркой, что статической проверки типов нет.
.
# Параметрический полиморфизм -- это возможность алгоритма работать с данными "не названных" типов, которым присвоены абстрактные имена. Т.е. типы являются Параметрами алгоритма, равно, как и его аргументы. Это всеми нами гороче любимые Generic-и. Например: Array -- это пример Параметрического полиморфизма. Tree, List etc. etc.
:+1:
Только утиная типизацияи структурная типизация это не одно и то же. Например, автоматическую реализацию интерфейсов в Го некорректно называть утиной типизацией.
Как по мне, в дженериках тоже после компиляции работаем с мономорфным типом и оно становится ad-hoc.
@@haykmkrtchyan7093 думаю, это зависит от языка и от дженерика. Например, в TS на тип-параметр можно наложить органичение: соответствовать какому-либо интерфейсу и тогда все пойдет по полиморфизму подтипов. А может и зарезолвится в ad-hoc полиморфизм -- если это например: f = (a: T, b: T): T => a + b;
В общем, параметрический полиморфизм -- это круто, полезно и вкусно.
Очень полезный комментарий. Спасибо)
Белы фон вам не идет. Прежние видео были ламповее, чтоли.
@kotto Почему частное? В последнем постанвлении правительства тоже про это говорится.
Дублировать текстом вещи о которых идет речь есть очень хорошо. Примеры бы с кодом какие в виде призентации на фоне. А так супер!)
Спасибо!
Я из тех кому все равно на фон, звук, одежду и прочее.
Содержание - Самое главное!
Спасибо за содержание!
P.S. Мне во всех ваших видео нравится антураж
прикольный формат, но прошлый был, как-то, более по-домашнему, более уютно)
Согласен, кажется сейчас домашний формат в тренде
Кря
Ой, сколько новых видео!!! Сергей, ставлю лайк даже не посмотрев (сейчас исправлю эту ошибку), так сказать заочно! Большое вам спасибо! Долго отсутствовал, сейчас буду смотреть каждое новое для меня видео.
Блин. А про if-то мысль реально хороша. Объяснение полиморфизма через нее пока самое доступное на моей памяти.
Было бы круто добавить короткий пример замены if-а или оставить ссылку на него.
Да сложно представить истинный полиморфизм заменяющий IFы без перегрузки или нарушения инкапсуляции - первого принципа ООП.
Разве только приходит в голову методика разыменования аргумента в метод базового класса или что-то подобное!
ПС: Возможно перегрузка методов-интерфейса хороший вариант решения данной проблемы и я так понимаю что это не будет считаться как ad-hoc полиморфизм.
потерялась ламповость видео. теперь сухой профессионализм.
двоякое чувство)))
За столом как то интересней и привычней. А еще на столе стоит великолепная кружка!
В видео было много слов, но, к сожалению, некоторые из них правильные, а некоторые - нет. В итоге складывается впечатление, что полиморфизма всего два, и из них один какой-то неправильный (ad-hoc).
Что лишний раз подтверждает тезис, что практика без теории __слепа__.
Ниже определение полиморфизма более-менее соответствующее теории.
Полиморфная переменная -- это переменная, которая может принимать значения разных типов данных.
Полиморфная функция -- это функция, у которой хотя бы один аргумент является полиморфной переменной (не забываем о методах, которые суть функции, и у которых есть неявный первый параметр this).
Полиморфная функция бывает двух видов.
Ad-hoc полиморфизм - когда функция ведет себя по разному для аргументов разных типов. Функция "нарисовать" - рисует по разному разные геометрические фигуры.
Параметрический полиморфизм - когда функция ведет себя одинаково для аргументов разных типов, нет информации о настоящем типе и значение любого типа может быть передано в качестве аргумента. Пример - функция "положить элемент в контейнер". Заметим, что subtype полиморфизм (который в ООП называют просто полиморфизмом, когда вместо ссылки на базовый класс можно передать ссылку на производный) __НЕ__ является параметрическим полиморфизмом, потому что тип известен (тип базового класса).
Иногда выделяют статический и динамический полиморфизм - когда тип разрешается во время компиляции, или во время выполнения.
Теперь можно рассмотреть частные случаи:
1. _Преобразование чисел_, когда функция принимает double, туда иногда можно передать целые числа и float, этот вид полиморфизма часто называют automatic coerce, в разных языках делается по-разному, скажем в OCaml его вообще нет и нужны явные преобразования.
2. _Перегрузка функций_, когда одно имя функции используется для аргументов разных типов и количества аргументов. Используется в постпроцедурных ОО языках, таких как С++, Java, C#. В функциональных языках отсутствует, поскольку ломает вывод типов (впрочем в Haskell нетрудно сделать аналог перегрузки).
3. _Параметрический полиморфизм_, когда функция получает тип (или несколько типов в качестве параметров), например `foo(a: T): T` - функция имеет один параметр-тип и один полиморфный параметр, который связан с этим типом. Такой полиморфизм известен под именем generics, и присутствует под этим именем в Java, Kotlin, C#, Scala и может быть в будущем Go :-) Почему в Scala этот вид полиморфизма значительно мощнее? Потому что на параметры-типы можно накладывать очень детальные ограничения, например:
def lift[F[_]: Functor]: F[A] => F[B]
здесь на параметр F накладывается ограничение, что F - это тип с параметром, и подтип типа Functor (который тоже параметризован, но это можно узнать посмотрев его определение).
В Haskell (или ещё более далёком от мейнстрима Idris) ограничения на типы могут быть ещё более детальные, и сами параметры-типы можно связать ограничениями, и это всё позволяет отсеивать компилятором огромное количество ошибок.
Таким образом, ограничения позволяют прокинуть мостик между параметрическим и ad-hoc полиморфизмом и выбирать какой-то нужный вам баланс. Впервые большой шаг к этом сделал Филипп Вадлер в работе "How to make ad-hoc polymorphism less ad hoc" users.csc.calpoly.edu/~akeen/courses/csc530/references/wadler.pdf
4. Наконец _полиморфизм подтипа_ - это вид ad-hoc полиморфизма, когда первый неявный параметр this имеет тип базового класса, диспетчеризация происходит в рантайме, обычно с помощью VTable. С точки зрения теории довольно слабый вид полиморфизма, поскольку ограничение на тип лишь одно, типом базового класса снизу. Естественно, делает невозможным точный вывод типов, не позволяет диспетчеризоваться по нескольким типам параметров, и по типу возвращаемого значения, вынуждает делать нетипобезопасные преобразования (т.н. downcasting).
5. Также есть ещё row polymorphism, когда селектор поля, например .user в разных записях может выступать как самостоятельное значение, передаваться в параметры и использоваться в полиморфных контекстах, а будучи применённый к разным значениям, скажем account и book возвращает соответственно account.user и book.user. Чем-то напоминает структурные типы, но гибче.
6. Есть ещё много других, таких как family polimorphism, но это уже глубины теории типов, до практики они ещё не дошли.
Итог. Сергей Немчинский конечно хороший дядечка, позитивный и харизматичный, но не стоит верить всему, что он говорит без оглядки, нужно проверять сведения и читать хорошие книжки, скажем Пирса "Типы в языках программирования".
Спасибо что успакоели меня (Scala кодера) а то прям кровь из ушей лилась.
Думал сам закаментировать но решил сначала адекватный коммент поискать.
Ещё + вам в догонку.
@DASSDED ну что спросили ?)
Сергію, дякую! Не додам нічого нового до того, що сказано іншими, просто урок вийшов традиційно змістовним і цікавим і заслуговує на "свіжий" коментар))
Советую поработать над звуком. В новой обстановке эхо от стен напрягает.
Плюсую. Со звуком точно нужно что то делать. Эхо очень жёсткое.
И кстати. В целом формат очень классный. Двигаетесь в правильном направлении. Но звук поправить надо =)
Очень крутой формат, намного лучше предыдущего.
Классно получилось, спасибо Сергей!
P.S. в следующий раз напишите титрами когда можно открывать уши)))
ахахаха. Хорошо
Аааааа как же не привычно) но видео классные! Спасибо!
Мне новый формат даже больше понравился, чем старый
Очень полезные и информативные ролики получаются у вас. Хотим больше "обучалок"
Отличный формат! Всё очень лаконично и очень информативно!
Sergey, плакал в голосину, когда узнал, что не я один отделением состояния от поведения озадачен.
Пробовал даже чинить подобное упущение, добавляя для каждого сервиса-интерфейса(со свеой иерархией) "сервис-маршрутизатор"(не знаю как иначе назвать), который, в зависимости от получаемой имплементации доменной сущности(с общим интерфейсом) делегирует соответствующему обработчику(ну и результаты мержит).
По поводу ИФов и тему с простыней хотелось бы увидеть пример кода))
chat GPT в помощь. Я только что у него попросил переписать мой метод где много ИФов было, осталось только понять ответ ))
Не хватает зарисовочек на белом фоне, чтобы визуально было понятно на примере, а так как радио послушал, но в целом как всегда супер;) спасибо за видео
Вы молодец. Достаточно давно слежу за вашим каналом. Даже 2 месяца был на проекте в вашей школе. Надеюсь, даже спустя неделю, вы прочитаете этот коммент. Хотелось бы и мне высказать свое мнение по поводу видео, хотя обычно комменты не оставляю.
С фоном лампово и по домашнему, без фона - динамически и по современному. Больше всего понравились тезисные подпись. С ними как-то проще воспринимается информация. Можно подписи оставить (пофиг на фон))
Новый формат - мне зашёл )
Новый формат - супер! Осталось только английских субтитров добавить чтоб весь мир смотрел :)
Согласен если с делать субтитры и английское название водосам, даже старым это взлетит.
Хорошее видео. Кстати про абстракцию согласен, масло масленое. Абстракция есть отказ от неких свойств объекта, которые не важны в контексте решаемой задачи. Это вообще используется в любой области жизни. Если я нанимаю строителя, чтобы он делал ремонт, мне важно умеет ли он красить, класть плитку, штукатурить и совершенно пофигу умеет ли он играть на балалайке.
Благодарность за coding by exception!
Не всегда нужно использовать наследование для достижения параметрического полиморфизма. Есть языки, в которых импелементация интерфейсов не требует наследования (Rust, Go, Typescript). Есть дженерики и темплейты. Есть Duck Typing и динамические языки. Конечно, это не значит, что не нужно использовать наследование, но его ограниченность нужно понимать и стараться избегать.
+1 за новый формат
Кратко, ясно, понятно. Благодарю.
Фон лучше убрать - верните как было)
Во фронтэнде - новый формат видео, а в бэкэнде релокация офиса ? =)
Ну прям очень-очень интересно слушать. Хоть ничего и не понимаю ))))
Смотрю уже 30 ролик, ничего не понимаю но очень интересно!
А мне понравилось. Полиморфизм серьезная тема, и белый фон как бы говорит что нужно внимательно слушать Сергея а не смотреть что на столе лежит
Ну наконец то мой любимый полиморхвизм)
Новый формат супер! Все внимание фокусируется о том, что говорит диктор☝🏻 Возможно, для лучшего понимания полиморфизма можно было бы добавить несложные схемы или код, чтоб акустическся информация еще визуально подкреплялась. Сергей, спасибо Вам!
По моему опыту, это наиболее полное и понятное объяснение полиморфизма на русской ютубе. И за инфу про объекты без поведения и сервисы без состояния отдельное спасибо, это действительно имеет место быть и на это стоит акцентировать внимание, чтобы понимать современные реалии проектирования ПО.
Приятно смотреть ваш канал. Спасибо за хороший контент. Успехов.
Хороший эксперимент с фоном. За столом было душевнее.
Но с белым фотом можно выводить дополнительную информацию.
Единственное я бы добавил больше информации. И когда она появляется, сдвигал спикера больше в бок
Лайк сразу, новый формат понравился, с примерами кода думаю было бы лучше, а в общем всё кратко и по делу. Спасибо большое)))
примеры кода были бы не очень показательными, мне кажется. Но я подумаю
@@SergeyNemchinskiy Как говорится "не попробуешь - не узнаешь")))
разделение видео на части - хорошая идея. Использовать для этого пятисекундные вставки с логотипом выглядит растягиванием хронометража. Они одинаковые и скучные. Можно хотя бы названия этих частей туда вставлять
а лучше вообще убрать
название частей в разделении хорошая идея, а еще под видео сделать "оглавление" с ссылками на эти самые части видео.
а можно на эти заставки вставлять что-то интересное, трейлеры фильмов например
Белый фу, только темная тема!))) Сергей, спасибо
Прикольная смена, но я ещё не проверял просмотр ночью в темноте) но пока нравится весь формат - по современному, что ли)
мы именно для этого и старались
спасибо очень интересно. Побольше информации для чайников от архитектора как устроен компьютер интернет сайты и серверы..
читаешь порой вакансии и запутаешься в терминах разжуйте пожалуйста в видео вакансии с hh.ru например думаю многим будет интересно:"
Минимум 2 года опыта коммерческой разработки ПО.
Хорошее знание теор. минимума computer science.
Хорошее владение языком Java, опыт серверной разработки на нем.
Знания и опыт многопоточного программирования.
Знакомство с JavaScript, опыт разработки браузерных приложений
Опыт работы с Java 8
Знакомство с продуктами Atlassian.
Знакомство с функциональными языками программирования, FRP.
Писать unit-тесты, в отдельных случаях - интеграционные тесты.
Structure - Atlassian SDK, Java, REST, JavaScript, jQuery, HTML5. Рабочее окружение - IntelliJ IDEA, Git, Maven, TeamCity, BitBucket Server, Docker. Тесты серверного кода пишутся на Groovy / Spock, клиентского - на JavaScript / QUnit.
Мы широко используем Structure
новый важный функционал покрывается unit-тестами;
Code Review у нас обязателен для каждого изменения;
подробное ручное тестирование готовых сборок.
Сергей, судя по фону, вы устроились в Apple, поздравляю!
Это был бы шаг назад. У Сергея своя фирма.
@Volodymyr Volodymyr ээээммим всегда. Если там не условия как у шаха
Можете тогда рассказать, что понимают под абстракцией, почему считают принципом ооп, и почему это не принцип ооп?
Рівень відео зростає, що не може не радувати!
Очень хочется услышать про абстракцию, пусть и не как принцып ООП, но как пример работающей методологии.
хорошо :) А вы почему не подписались? :)
Первую очередь спасибо за видео. Было бы лучше показать + примеры как работает полифогизм :-)
Отлично! Спасибо за труд!
Не плохо бы побороть эхо и использовать пастельные тона в качестве фона. Спасибо за информацию)
С напряжением смотрел видео, ожидая, когда же ты начнёшь как обычно "гы-гы" впопад и невпопад. НО ЭТОГО НЕ ПРОИЗОШЛО!!! Прям видно, как нелегко тебе это давалось! Но ты смог! Респект и уважуха!!! 👍🏻👍🏻👍🏻😂 Так гораздо представительнее и производит лучшее впечатление. Признаюсь, эти постоянные гы-гы раздражают, но может это проблема во мне 😂
Новый формат определённо имеет право на существование, но и старый оставить тоже было бы неплохо. Возможно, стоит выбирать формат в зависимости от темы.
Согласен с другими комментаторами на тему звука (эхо) и притянутых за уши вставок-заставок. Если бы меня попросили выбрать лишь один формат из двух, то пока что старый побеждает. Но ИМХО пока ещё рано делать выводы. После пяти-десяти роликов в новом формате понятнее будет.
Спасибо за интересный канал 👍🏻
о господи... А вы понимаете, что такими комментариями очень демотивируете авторов? Зачем вы это делаете? У вас проблемы с самооценкой?
@@SergeyNemchinskiy Не понимаю. Честно.
@@Alexander.Portnoy ну, теперь вы знаете
Сергей, здраствуйте.... бил би очень благодарен за какой нибудь конкретний пример замени if полиморфизмом, или если у вас есть уже такое видео, то буду благодарен за линку, а то чтото никак в голове такой код не виресовуется....
Спасибо
Идея с новым фоном хорошая. Возможно стоит попробовать снимать стоя.
Один раз захлох на этом вопросе на собеседовании. Спасибо за Ваш труд
Есть вопрос по поводу применения вставок с помощью JNI. Кроме самого логичного кейса использования сишных и ассемблерных вставок в Android приложениях, это вообще имеет место быть? Просто это рушит весь принцип jvm и тд. Какие кейсы использования можете привести?
Слышать всегда интересно! но эхо действительно мешает и фон белый асоциация с больницей, а вот без стола смотритесь солиднее:)))
Отсутствие хранимого состояния, позволяет относительно легко горизонтально масштабироваться, сравнительно легко тестировать части, и легко дебажить. Самое сложное для понимания это state machine, чем является по сути любой объект в ООП.
Из за этого, куча фреймворков и принуждает разделять хранение и обработку. Век вертикального масштабирования, сменяется горизонтальным и пора бы переходить на функциональщину.
Сергей, запишите видео почему вы перешли с C++ на Java. Я постигаю плюсы, очень нравится, но очень сложно=), потому крайне хотелось бы послушать вас. Благодарю!
Спасибо за интересное видео👍
Но возможно стоит включить тёмную тему
самый топовый канал. Немного музычка отвлекает на фоне
Благодарю за информацию . Поздравляю скоро 100 000 подписчиков .
У меня не большой канал но тоже стараюсь для начинающих в айти делать хорошие видео .
Если что заглядывайте надеюсь понравится я очень стараюсь .
Где-то слышал что полиморфизм это когда объект подкласса можно использовать вместо объекта родительского класса.
Например есть класс Person и производный от него класс Student, объект класса Student имеет 2 формы, он является и человеком и студентом
Зашел только для того, чтобы убедиться что автора всё еще зовут Сергей Немчинский. Убедился, теперь можно снова спать спокойно
Что такое - паттерн? Простым языком пожалуйста. И если будет не сложно на нескольких примерах. Заранее спасибо.
погуглить не судьба? я и то погуглил
Кажется вы перепутали Parametric polymorphism (параметрийчний полиморфизм - на нем построены дженерики) с Subtype polymorphism (полиформизм на основе подтипов).
Он перепутал полиморфизм в информатике, с полиморфизмом в ООП.
Чувак полный профан.
Ничего он не перепутал. Он все правильно сказал.
@@ПетровВладимир-е2у ахаха, то есть полиморфизм в ООП по-твоему существует отдельно от информатики?
Прикинь, да.
Я смотрю он тут не один такой.
Лично я полиморфизм понимаю так: есть полиморфизм с точки зрения перегруженных (overload) методов и переопределенных (override). Полиморфизм для перегруженных методов - не более чем "синтаксический сахар", т.к. в ООП функции однозначно идентифицируются по имени и по формату входных параметров (их тип и количество), то для удобства написания кода разработчику стоит помнить только одно название метода, а конкретная функция по данному имени будет выбрана уже компилятором на основе формата входных данных и встроена в код.
А полиморфизм для переопределенных методов - это т.н. "динамическая диспетчеризация методов", которая работает во время исполнения программы, вызов конкретной реализации функции зависит от типа определенного объекта, а не типа ссылки объекта. Но тип ссылки объекта будет определять интерфейс взаимодействия с этим объектом. И в этом случае полиморфизм дает большие преимущества - вызываемой среде (какому-нибудь фреймворку, например) не нужно ничего знать об реализации объектов-наследников, если он уже знает интерфейс взаимодействия с объектом. И в байт-коде (если это Java) нет "жесткой" связи с функцией, которая должна вызываться, и JVM во время работы программы ищет реализацию конкретной функции для конкретного объекта, который реализует интерфейс.
Это позволяет, например, приложениям на Android динамически устанавливаться и запускаться без необходимости перекомпилировать фреймворк (базовую jvm-программу) Андроида (статически "встраивая" в него код приложения и жестко прописывая идентификаторы реализуемых функций), без перезагрузки и прочей дичи. Системе (исполняемой среде машины) ничего может быть неизвестно о собственных классах приложения и как с ними работать напрямую, но при этом знает, как взаимодействовать с известными ему базовыми классами (интерфейсами), унаследованными/имплементированными из фреймворка.
Именно такой полиморфизм позволяет быть фреймворку и приложению - отдельными модулями в одной исполняемой среде.
У меня примерно такое понимание складывается, сам изучаю Java по книге Шилдта. И лично мне всегда казалось, что полиморфизм (с практической точки зрения, а не абстрактной теории) - это только про переопределяемые методы, который существует только в ООП. А перегрузка - это просто иной способ однозначной идентификации функции по тому же имени, но с разным форматом входных данных, которая, в теории, вполне могла бы существовать и в ФП.
06:45 тут я поностальгировал по былому формату
Спасибо. Давайте про Event Sourcing, DDD и CQRS.
Сергей, отличный формат, но мне кажется слишком много наездов/увеличения камеры и возможно лучше использовать текст либо при наезде либо нет) Спасибо за видео
Насчет if и полиморфизма. Мне кажется нельзя совсем избавиться от if, его можно спрятать глубже. Где-то будет выбор, какой экземпляр используеься.
правильно понимаете :)
Полиморфизм? Не, не слышал.
Эхо мешает сильно
Отлично! Тока нужно поменять произношение слова else, а то слух режет)
А интересно, функции с перегрузкой, не if используют ???
Без примеров кода понятно скорее тем, кто в теме! Примеры кода, думаю, логично предоставлять на Java.
вряд ли, в случае наследования, колесо истории повернет ход, на самом деле все движется к функциональщине и ООП отодвигается все дальше и дальше, а куча кода построенного на инверсиях и инъекциях без наследования вряд-ли будут переписывать по новой, да и плюсов у такого подхода тоже не мало.
Корректным ли будет такое определение: Полиморфизм это способность объектов вести себя по разному в зависимости от принимаемых ими методов?
Вы главное лайки ставьте. Тут не до ваших вопросов.
По поводу фона, хотелось бы менее крупный план, чтобы голова ближе к центру была)
фон точно менять будем
В ардуиноIDE есть патерны?
Инкапсуляция в смысле сбора в одно место есть ещё в древних сях, что как бы говорит
а как же тогда реализовать многочисленно ветвящиеся проверки?! я начинающий программист(только не на джаве), вот я написал портянку из этих if'ов. неудобная она, понятно.. а ещё дописать много надо в неё же(логика сложная).
как её перестроить в объекты? все условия разные...
думайте :) Любой if заменяется на полиморфизм :)
refactoring.guru/ru/replace-conditional-with-polymorphism
Согласен с предыдущими комментариями про белый фон и ламповость.
По поводу видео: про полиморфизм после видео понятнее не стало. Наверно, словами такое не объяснить, нужны примеры кода
мы учтем :) это блок видео (5 штук ) будет на таком фоне, дальше попробуем другой. И стол :)
Ну, если не про абстракцию,может про MVC? :)
Это хоть и не принцип ООП, но новичакам полезно бы послушать
Разве при перегрузке методы называются по разному? Или это просто оговорка?
спасибо, помогло на собесе
Дуже дякую!
Наследование - это да. А как же интерфейсы? Можно вместо базового класса использовать интерфейс. И тогда метод может принимать любой класс реализующий этот интерфейс.
Интерфейсы реализуются через наследование.
Поли - Много, морфизм - форм. Полиморфизм - много форм.
Спасибо за материал.. но музыкальная подложка все портит.. Получается что музыка на фоне отвлекает от повествования... как будто в шумной кафешки сидишь...
Ну молодца
Запишите плиз видео, почему абстракция - не принцип ооп.
Запиши про абстракцию все таки, только не в ключе ООП, а своё мнение
Достаточно сумбурно и узко.
.
По ссылке все разложено гораздо лучше: en.wikipedia.org/wiki/Polymorphism_(computer_science)
.
По лекции. "Полиморфизм не возможен без наследования". Возможен, если есть интерфйсы. Интерфейсы реализовывають, а не наследуют. Кроме того, возможен структурный полиморфизм (см. JS), при котором происходит реализация интерфейса без явного декларирования обязательства его реализовать.
.
Что касается наследования и полиморфизма. Ноги здесь растут из С++-ных чисто-абстрактных классов, которые играют роль интерфейсов и там реализация интерфейса синтаксически декларируется, как наследование. Вместе с тем, если класс действительно чисто абстрактный, то никакого наследования не происходит (наследовать нечего). К тому же, это конкретная реализация, в конкретном языке программирования (ЯП). Если же ЯП допускает указние интерфейса в качетсве типа аргумента функции/метода, то полиморфизм возможен и без наследования. Более того, именно такая форма полиморфизма и рекомендована D-принципом из SOLID.
.
А вот с параметрическим полиморфизмом вообще незадача вышла. Во-первых, описанное в лекции больше подходит под "Полиморфизм Подтипов" en.wikipedia.org/wiki/Subtyping
.
А во-вторых, Параметречиский полиморфизм -- это возможность создать целый класс классов (типов)/функций, имеющих общую реализацию, независимо от того, на какие типы опирается каждый/ая конкретный/ая из них. Это вот совсем не полиморфизм подтипов. Например, у нас есть такое понятие как матрица, матрицы можно складывать, умножать на число, на другую матрицу, можно находить обратную матрицу, и соответственно можно даже делить одну матрицу на другую (умножать на обратную).
.
Так, вот можно реализовать класс Matrix, который будет это все делать, скажем, для целых чисел, можно сделать тоже самое для вещественных, комплексных и т.п. Но, все эти алгоритмы будут одними и теми же. Так родились шаблоны в C++ и Generic-и в Ява (C#, TypeScript и большом числе других языков).
.
class Matrix {
// ...
}
.
это и есть пример параметрического полиморфизма. Собственно: Array -- это тоже пример параметрического полиморфизма. Класс работает для любых типов T, даже не связанных наследованием и даже не требующих реализации специфического интерфейса (в случае с матрицами там на параметрический тип Т накладывается ограничение, т.к. требуется, что для значений из него были реализованы определенные операции, определена единица, ноль и т.п.). Параметрический полиморфизм -- это программирование на типах (создание функций, которые на вход получают типы, и на выходе имеют типы).
.
И все это ну никак с наследованием не связано. Т.е. оно может существовать параллельно с наследованием, т.к. вполне себе можно унаследоваться от Generic типа.
.
Ну и еще, на полиморфизм можно посмотреть с другой стороны, т.е. не только со стороны полиморфного алгоритма, но и со стороны полиморфного класса. Скажем, если некий класс реализовывает несколько интерфейсов, то его вполне себе можно назвать полиморфным (скажем, интерфейс серрилазиации/десерриализации и интерфейс инспектирования). Но, отсылки к такому типу полиморфизма редки и, вряд ли, существенны.
Вернити уютный офис :с
холодно как то в вашей студии :С
А разве параметрический полиморфизм это не история про обобщенное программирование?По моему здесь вы говорите про полиморфизм подтипов (subtyping)
Сергей классный формат, но можете ответить на вопрос: "В какой ОС лучше всего писать код? "
как вам удобнее рабоотать
а мне наоборот, всегда было непонятно, почему никто никогда не говорит о том, что if-ы - это по сути альтернатива полиморфизму. Ведь if это как раз об этом - проверить что-то, что в принципе может быть разделено на 2 (или более, если с else) класса с общим предком, в котором, так сказать, описан весь тот контекст, в котором мы работаем
Эхо сильное, а так формат хороший :)только в старом формате было прикольно наблюдать за новыми вещами на столе и в фоне...
Так через интерфейсы реализуется полиморфизм...зачем наследование 🙄
- О себе вы указали "программист с большим стажем", так, неплохо. Что вы имели ввиду под уровнем английского D8?
- Илс.