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和其他一些语言.您应该显式声明接口实现.
归档时间: |
|
查看次数: |
906 次 |
最近记录: |