C# 有用或非繁琐的双重接口示例

C# 有用或非繁琐的双重接口示例,c#,functional-programming,system.reactive,reactive-programming,category-theory,C#,Functional Programming,System.reactive,Reactive Programming,Category Theory,最近Erik Meijer和其他人展示了IObservable/IObserver是IEnumerable/IEnumerator的。它们是双重的,这意味着一个接口上的任何操作都是有效的,从而为提供了理论基础。 是否存在其他双重接口?我对任何例子都感兴趣,不仅仅是基于.Net的。另一个例子是TextReader和TextWriter,尽管噪音比可观察和可枚举的噪音还要大。原则上,类型签名应为: interface ITextReader { // Read: void -> int

最近Erik Meijer和其他人展示了
IObservable/IObserver
IEnumerable/IEnumerator
。它们是双重的,这意味着一个接口上的任何操作都是有效的,从而为

提供了理论基础。
是否存在其他双重接口?我对任何例子都感兴趣,不仅仅是基于.Net的。

另一个例子是
TextReader
TextWriter
,尽管噪音比可观察和可枚举的噪音还要大。原则上,类型签名应为:

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

interface ITextWriter {
  // Write: int -> void
  void Write(int val);
}

另一个例子是产品类型A.B和两种类型A和B的总和类型A+B。在Haskell中,您可以将它们写成:

data Prod a b=p a b——这与对类型(a,b)相同。

数据和AB=左a |右b——与a或b类型相同


检查细节

协方差和逆变是另一个例子。我想。我可能错了

:“不同学科中存在着许多二重性,为不同领域之间的巨大知识转移提供了条件。例如,在形式逻辑中,De Morgan定律允许将由连接构建的表达式转换为由析取构建的表达式,反之亦然。在电子学中,电容器和电感的行为存在相似之处:知道其中一个以及如何在域之间来回,你知道另一个。傅立叶演算提供了时域和频域之间的对偶

他们还将System.Reactive称为System.Interactive的对偶。因此,其中一个程序集中的大多数功能在另一个程序集中都具有对偶性。要澄清的是,IO不仅是IE的对偶性,而且对其进行操作的功能也具有对偶性

因此,为了回答您的问题,存在许多双重化接口。您可以对任何接口进行双重化。您只需交换输入和输出以及函数的方向。有些接口将不会有用,或者它们本身就是双重接口。然而,有时真的有强大的接口隐藏起来等待发现。

小心使用“双重接口”这个术语。“虽然术语dual在这里的用法显然是正确的,但是短语dual interface通常与
IDispatch
和自动化联系在一起,这有点令人困惑(这就是我在打开这个问题之前所想的问题)。