2010-11-27 55 views
3

我對返回接口的方法的概念有點困惑。有沒有一篇文章或參考文獻詳細討論這個問題?我對什麼時候/爲什麼要這樣做感到困惑,以及它如何能夠與它關聯的對象(我認爲是正確的)建立一個接口。C# - 返回接口的方法

+1

我給你做一個接口,但後來我鑄造它...;) – 2010-11-27 17:13:21

回答

14

我就當/你爲什麼會想這樣做困惑,

返回的接口是很好的,當你想的是應該做的事合同分開,從具體實施(它是如何做到的)。有了一個接口,您可以更輕鬆地重用和修改代碼。

如果你有一個接口IFoo而且在可以編程針對接口和獲得基本功能的簡單的方式實現IFoo實現SimpleFoo。稍後,您可以製作一個AdvancedFoo實現,該實現也實現了相同的IFoo接口。現在你只需要返回你的新對象,其餘的代碼將使用新的更高級的類而不需要任何改變。擁有該接口還允許您選擇在運行時使用哪個類。

當你的代碼返回接口時,它也使它更加靈活。您目前可能會退回List<T>,但如果結果只需要用作IEnumerable<T>,則應該返回此值。然後,您可以稍後更改您的實現,以便動態生成結果(例如使用迭代器塊)並且調用代碼仍然可以工作。

它是如何向/從對象它與

相關的接口的整點你可以施放一個接口,你不應該需要做到這一點。你應該只使用接口而不用擔心具體的實現是什麼。運行時會調用正確的方法。如果你認爲你需要投入,它可能表明你的界面不夠豐富,無法支持你的需求。

,如果你需要,雖然你可以施放:

IFoo foo = getFoo(); 
SimpleFoo simpleFoo = (SimpleFoo)foo; 

注意,這個投可能會失敗,您可能需要使用as代替:

IFoo foo = getFoo(); 
SimpleFoo simpleFoo = foo as SimpleFoo; 
if (simpleFoo == null) 
{ 
    // Too bad... 
} 
else 
{ 
    // Now we can use simpleFoo. 
} 
+0

這是我所見過如何接口返回的一個例子。在我們的應用程序中,我們有一個客戶端通過Wcf從我們的服務器獲取數據。我們沒有爲每個實體類型使用不同的'Get'方法,而是有一個Get方法返回一個接口。該接口包含一個指示實體類型的屬性。基於類型,接口(對象)被轉換爲適當的類型並使用。 – Hosea146 2010-11-27 17:22:33

0

我不知道什麼是混淆約它。一個接口基本上等同於一個沒有非抽象方法但沒有聲明狀態(字段)的抽象類。所以返回接口就像返回一個抽象基類。

你想要返回一個接口的原因是接口代表了一小堆功能,而不是完整的對象。一個典型的例子是返回IEnumerable而不是List,因爲即使底層對象可能是一個列表,該方法實際上只是返回一組有序對象,這是所有調用者都應該看到的。將來,該方法可能會返回一個數組或其他數據結構。但對調用者無關緊要,因爲所有調用者都看到IEnumerable。這遵循編程接口的一般原則而不是實現。

0

方法不能返回接口本身。接口是對象應該實現的方法的描述。你不能返回一個對象需要的方法列表。

你可以做的是返回一個接口的實例。看起來像這樣的代碼:

using System.Collections.Generic; 

ICollection<int> getCollection() { 
    return new LinkedList<int>(); 
} 

此方法返回LinkedList的一個實例,但其返回類型是ICollection。這意味着您可以使用getCollection()的返回值,因爲您可以使用ICollection,因爲LinkedList從ICollection繼承。如果返回類型是LinkedList,那麼只能使用LinkedList所在的返回類型,這會降低靈活性。

C# interfaces tutorial

1

有時你想,因爲它是返回一個實現它的任何類的一般方法,返回的接口。您不必擔心返回的實際類是什麼,因爲您可以調用接口中的方法。

例如:

public interface IFooBar 
{ 
    String GetData(); 
} 

public class Foo : IFooBar 
{ 
    public String GetData() { return "Foo"; } 
} 

public class Bar : IFooBar 
{ 
    public String GetData() { return "Bar"; } 
} 

public class DataManager 
{ 
    public static IFooBar GetFooBar() 
    { 
     IFooBar foobar = ... 
     return foobar; 
    } 
} 

public class MainAppClass 
{ 
    public void SomeMethod() 
    { 
     //You don't care what type of class you get here 
     //you only care that the object you get back let's you 
     //call GetData. 
     IFooBar foobar = DataManager.GetFooBar(); 
     String data = foobar.GetData(); 
     //etc 
    } 
}