C#和接口 - 显式与隐式

Jas*_*ker 10 .net c# casting duck-typing interface

在C#中,如果一个类具有接口的所有正确方法/签名,但没有明确地实现它,如:

class foo : IDoo {}
Run Code Online (Sandbox Code Playgroud)

该类仍然可以作为该接口进行转换吗?

Dan*_*nov 17

鸭子打字

你所暗指的是被称为" 鸭子打字 "(以成语命名"如果它看起来像一只鸭子,像鸭子那样呱呱叫,那么它一定是鸭子").

使用duck-typing,一旦你实现了相关的成员(就像你描述的那样),接口实现是隐式的,但是.NET目前没有对此有任何广泛的支持.

通过为未来规划的紧急动态语言功能,如果在不久的将来运行时本地支持这一功能,我不会感到惊讶.

同时,您可以通过反射合成鸭子类型,使用这样的库,这将允许您像这样进行鸭子类型的转换:IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)

一些琐事

有趣的是,C#今天有一个小型的地方正在使用鸭子打字 - foreach操作员.Krzysztof Cwalina ,为了能够被foreach运营商列举,一个班级必须:

提供一个不带参数的公共方法GetEnumerator,并返回一个包含两个成员的类型:a)一个方法MoveMext,它不带参数并返回一个布尔值,和b)一个属性Current,带有一个返回Object的getter.

请注意,他没有提到IEnumerable也没有IEnumerator.虽然在创建可枚举类时实现这些接口是很常见的,但是如果要删除接口但是保留实现,那么您的类仍然可以枚举foreach.瞧!鸭打字!(这里的示例代码.)


Meh*_*ari 12

不,它不像Objective-C和其他一些语言.您应该显式声明接口实现.

  • 为了避免出现任何混淆,请记住"明确实现接口"在C#中具有另一种含义:http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx (14认同)
  • 是的,如果您的类没有明确地实现接口,那么如果您尝试将其强制转换,则会出现异常. (4认同)