在C#中,如果类具有接口的所有正确方法/签名,但不明确地实现它,如:
class foo : IDoo {}
该类仍然可以作为该接口进行转换吗?
答案 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返回一个 对象
请注意,他没有提及IEnumerable
或IEnumerator
。虽然在创建可枚举类时实现这些接口很常见,但是如果要删除接口但保留实现,则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