Как сочетать и противоречиво использовать при разработке бизнес-приложений? - PullRequest
16 голосов
/ 11 марта 2011

Я знаю об использовании co- и contravariance в стандартной библиотеке (например, коллекции и признак Function). Мне интересно, как co- и contravariance используются при разработке бизнес-приложений "реального мира".

Ответы [ 2 ]

23 голосов
/ 12 марта 2011

Классическим примером являются функции, использующие интерфейс Scala для функции с одним аргументом:

trait Function1[-T1, +R]

, который является контравариантным (-) для аргумента и ковариантным (+)) для возвращаемого типа.

Почему?

Представьте, что у вас есть эти классы:

class Timelord { ... }
class Doctor extends Timelord { ... }

class Enemy { ... }
class Dalek extends Enemy { ... }

Если у вас есть метод, который в качестве параметра принимает Doctor => Enemy функция;тогда все в порядке, чтобы предоставить экземпляр TimeLord => Enemy.Он по-прежнему будет принимать экземпляры Doctor.

Так что TimeLord => Enemy является подклассом из Doctor => Enemy, поскольку TimeLord является суперклассом из Doctor, это контравариантный в этом параметре.

Аналогично, функция, возвращающая Dalek, действительна, когда вам нужна функция, возвращающая некоторое Enemy, потому что Dalek is-anEnemy

Итак, Doctor => Dalek является подклассом из Doctor => Enemy, потому что Dalek является подклассом из Enemy, это ковариантный в этом параметре.

9 голосов
/ 12 марта 2011

Практически везде, где вы хотите использовать как параметрический полиморфизм (обобщенные данные) , так и наследование, вы, вероятно, в конечном итоге захотите либо объявление сайта дисперсии (+ / -) , использовать дисперсию сайта (подстановочные знаки) или, что более вероятно, оба.

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

Если вы посмотрите практически на любую библиотеку или фреймворк, вы найдете частое использование аннотаций отклонений. Если вы правильно абстрагируете свое приложение «реального мира», вы, вероятно, будете писать множество библиотек для его поддержки, с небольшим ядром критической бизнес-логики, прекрасно отделенным от всей инфраструктуры поддержки. Во всей этой инфраструктуре поддержки, вероятно, также будут часто использоваться аннотации отклонений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...