C#和接口 - 显式与隐式

时间:2009-04-24 20:48:05

标签: c# .net interface casting duck-typing

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

class foo : IDoo {}

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

5 个答案:

答案 0 :(得分:17)

鸭子打字

你所指的是“duck-typing”(以成语命名“如果它看起来像一只鸭子,像鸭子那样嘎嘎叫,那么它一定是鸭子”)。

使用duck-typing,一旦你实现了相关的成员(正如你所描述的那样),接口实现是隐式的,但是.NET目前没有广泛的支持。

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

与此同时,您可以通过反射合成鸭子类型a library such as this,这样您就可以进行类似鸭子的演员:IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)

一些琐事

有趣的是,今天在C#中有一个小型的地方正在使用鸭子打字 - foreach运营商。 Krzysztof Cwalina states为了能够被foreach运算符枚举,一个类必须:

  

提供公共方法GetEnumerator   没有参数并返回一个   具有两个成员的类型:a)方法   不带参数的MoveMext   返回一个布尔值,和b)一个属性   当前一个getter返回一个   对象

请注意,他没有提及IEnumerableIEnumerator。虽然在创建可枚举类时实现这些接口很常见,但是如果要删除接口但保留实现,则foreach仍然可以枚举您的类。瞧!鸭打字! (Example code here。)

答案 1 :(得分:12)

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

答案 2 :(得分:4)

如果IDoo有任何成员,则此代码将无法编译。如果IDoo没有成员,那么是的,演员是安全的(但显然使用有限)。

答案 3 :(得分:3)

这基本上要求Duck Typing在C#中工作,这不会自动发生。

但是有一些libraries可以做到这一点。

答案 4 :(得分:2)

public class A
{
   public void DoSomething();
}

public interface IDoSomething
{
   void DoSomething();
}

public class B : A, IDoSomething
{ }

B通过继承A

来满足IDoSomething.DoSomething