Никак не могу понять, что такое вариантность и ковариантность. Объсните по-простому. В частности, что это значит в Scala.
Здравствуйте, Grundik2, Вы писали:
G>Никак не могу понять, что такое вариантность и ковариантность. Объсните по-простому. В частности, что это значит в Scala.
Из реально полезного
тут и
тут.
Здравствуйте, Grundik2, Вы писали:
Подойдет?
У самого пока руки не дошли прочитать
Здравствуйте, Grundik2, Вы писали:
G>Никак не могу понять, что такое вариантность и ковариантность. Объсните по-простому. В частности, что это значит в Scala.
Еще есть контравариантность
В двух словах — это условия, при которых язык разрешает использовать производные классы вместо базовых (и наоборот).
Например, если метод базового класса возвращает ссылку на базовый класс, то нет причин запрещать перекрытию этого метода в производном классе возвращать ссылку на производный класс. Это ковариантность (т.е. отношения вариантности класса изменяются вместе при движении по иерархии).
То же относится, например, к набору исключений, который может выбросить метод.
А вот когда мы начинаем говорить об аргументах метода, то там может быть все наоборот — это будет контравариантность. А может и не быть. Зависит от того, как именно используется аргумент внутри функции (меняется или нет, и если меняется, то как).
Потом, может быть вариантность второго порядка, т.е. не непосредственная, а как параметр другого типа, например, контейнера. Т.е., например, массив объектов (указателей) производного типа можно трактовать как массив объектов базового типа, но только если ты не меняешь содержимое массива, иначе нельзя (потому что есть риск получить элемент неправильного типа — поэтому такие преобразования в С++ по умолчанию запрещены и их нужно делать явными через шаблоны).
В некоторые языки это дело встроено, но мне больше по душе подход С++, в котором можно настроить требования вариантности как угодно при помощи условий на типы в шаблонах.
Главное для понимания, когда что работает — принцип подстановки Лисков.
Здравствуйте, jazzer, Вы писали:
Если не ошибаюсь, ковариантность -- это быть либеральным в том, что возвращаешь,
контравариантность -- быть консервативным в том, что принимаешь(параметры). Или наоборот...
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, jazzer, Вы писали:
S>Если не ошибаюсь, ковариантность -- это быть либеральным в том, что возвращаешь,
S>контравариантность -- быть консервативным в том, что принимаешь(параметры). Или наоборот...
Ну можно и так сказать, осталось только определить, что значит либеральный и консервативный
Здравствуйте, Grundik2, Вы писали:
G>Никак не могу понять, что такое вариантность и ковариантность. Объсните по-простому. В частности, что это значит в Scala.
http://www.rsdn.ru/forum/decl/3557016.1Автор: nikov
Дата: 04.10.09
Здравствуйте, Grundik2, Вы писали:
G>Никак не могу понять, что такое вариантность и ковариантность. Объсните по-простому. В частности, что это значит в Scala.
Прямо сейчас на Курсере идет курс
Functional Programming Principles in Scala, где про вариантность, ковариантность и контрвариантность тебе расскажет лично Одерски
Здравствуйте, avpavlov, Вы писали:
A>Здравствуйте, Grundik2, Вы писали:
G>>Никак не могу понять, что такое вариантность и ковариантность. Объсните по-простому. В частности, что это значит в Scala.
A>Прямо сейчас на Курсере идет курс Functional Programming Principles in Scala, где про вариантность, ковариантность и контрвариантность тебе расскажет лично Одерски
Правда что-ли? А я просил как раз потому, что он не смог этого сделать понятно.