[英]C# and Interfaces - Explicit vs. Implicit
在C#中,如果一個類具有接口的所有正確方法/簽名 ,但沒有明確地實現它,如:
class foo : IDoo {}
該類仍然可以作為該接口進行轉換嗎?
鴨子打字
你所暗示的被稱為“ 鴨子打字 ”(以成語命名“如果它看起來像一只鴨子,像鴨子那樣嘎嘎叫,那么它一定是鴨子”)。
使用duck-typing,一旦你實現了相關的成員(就像你描述的那樣),接口實現是隱式的,但是.NET目前沒有對此有任何廣泛的支持。
通過為未來規划的緊急動態語言功能,如果在不久的將來運行時支持本機,我不會感到驚訝。
同時,您可以通過反射合成鴨子類型,使用這樣的庫 ,這將允許您執行這樣的鴨子類型轉換: IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)
一些瑣事
有趣的是,今天在C#中有一個小型的地方正在使用鴨子打字 - foreach
操作員。 Krzysztof Cwalina 指出 ,為了被foreach
運算符枚舉,一個類必須:
提供一個不帶參數的公共方法GetEnumerator,並返回一個包含兩個成員的類型:a)一個方法MoveMext,它不帶參數並返回一個布爾值,和b)一個屬性Current,帶有一個返回Object的getter。
請注意,他沒有提到IEnumerable
和IEnumerator
。 雖然在創建可枚舉類時實現這些接口是很常見的,但是如果您要刪除接口但是保留實現,那么您的類仍然可以通過foreach
枚舉。 瞧! 鴨打字! ( 這里的示例代碼 。)
不,它不像Objective-C和其他一些語言。 您應該顯式聲明接口實現。
如果IDoo有任何成員,則此代碼將無法編譯。 如果IDoo沒有成員,那么是的,演員是安全的(但顯然是有限的使用)。
這基本上要求Duck Typing在C#中工作,這不會自動發生。
但是,有些庫可以做到這一點。
public class A
{
public void DoSomething();
}
public interface IDoSomething
{
void DoSomething();
}
public class B : A, IDoSomething
{ }
B通過繼承A來滿足IDoSomething.DoSomething
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.