簡體   English   中英

C#和接口 - 顯式與隱式

[英]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。

請注意,他沒有提到IEnumerableIEnumerator 雖然在創建可枚舉類時實現這些接口是很常見的,但是如果您要刪除接口但是保留實現,那么您的類仍然可以通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM