Примеры полезных или нетривальных двойных интерфейсов - PullRequest
11 голосов
/ 24 января 2010

Недавно Эрик Мейер и другие показали, как IObservable/IObserver - это dual из IEnumerable/IEnumerator. Тот факт, что они являются двойственными, означает, что любая операция на одном интерфейсе действительна на другом, что обеспечивает теоретическую основу для Reactive Extentions для .Net

Существуют ли другие двойные интерфейсы? Меня интересует любой пример, а не только .Net на основе.

Ответы [ 3 ]

3 голосов
/ 24 января 2010

Другим примером является вид продукта A.B и тип суммы A + B двух типов A и B. В Haskell вы можете написать их как:

data Prod a b = P a b -- this is the same as the pair type (a,b)

data Sum a b = Left a | Right b -- the same as the Either a b type

проверьте здесь для подробностей

3 голосов
/ 24 января 2010

Другим примером могут быть TextReader и TextWriter, хотя шума даже больше, чем в случае наблюдаемых и перечисляемых. В принципе тип подписей будет:

interface ITextReader {
  // Read: void -> int
  int Read();
}

interface ITextWriter {
  // Write: int -> void
  void Write(int val);
}
2 голосов
/ 19 марта 2010

Ковариация и контравариантность - еще один пример. Я думаю. Я могу ошибаться.

Барт Де Смет говорит : «В различных дисциплинах существует множество двойственностей, обеспечивающих большой обмен знаниями между различными областями. Например, в формальной логике закон Де Моргана позволяет преобразовывать выражения, построенные из союзов, в выражения. построенный из дизъюнкций и наоборот. В электронике существует сходство между поведением конденсаторов и индуктивностей: знаете одно и как переходить назад и вперед между доменами, а вы знаете другое. Исчисление Фурье обеспечивает двойственные значения между временными и частотными областями ». Интересно.

Они также называют System.Reactive двойным System.Interactive. Так что большинство функций в одной из сборок имеет двойственную функцию в другой. Чтобы уточнить, дело не только в том, что IO - это двойник IE, но и функции, которые на них работают, также дуализированы.

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

...