我對返回接口的方法的概念有點困惑。有沒有一篇文章或參考文獻詳細討論這個問題?我對什麼時候/爲什麼要這樣做感到困惑,以及它如何能夠與它關聯的對象(我認爲是正確的)建立一個接口。C# - 返回接口的方法
回答
我就當/你爲什麼會想這樣做困惑,
返回的接口是很好的,當你想的是應該做的事合同分開,從具體實施(它是如何做到的)。有了一個接口,您可以更輕鬆地重用和修改代碼。
如果你有一個接口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.
}
這是我所見過如何接口返回的一個例子。在我們的應用程序中,我們有一個客戶端通過Wcf從我們的服務器獲取數據。我們沒有爲每個實體類型使用不同的'Get'方法,而是有一個Get方法返回一個接口。該接口包含一個指示實體類型的屬性。基於類型,接口(對象)被轉換爲適當的類型並使用。 – Hosea146 2010-11-27 17:22:33
我不知道什麼是混淆約它。一個接口基本上等同於一個沒有非抽象方法但沒有聲明狀態(字段)的抽象類。所以返回接口就像返回一個抽象基類。
你想要返回一個接口的原因是接口代表了一小堆功能,而不是完整的對象。一個典型的例子是返回IEnumerable而不是List,因爲即使底層對象可能是一個列表,該方法實際上只是返回一組有序對象,這是所有調用者都應該看到的。將來,該方法可能會返回一個數組或其他數據結構。但對調用者無關緊要,因爲所有調用者都看到IEnumerable。這遵循編程接口的一般原則而不是實現。
方法不能返回接口本身。接口是對象應該實現的方法的描述。你不能返回一個對象需要的方法列表。
你可以做的是返回一個接口的實例。看起來像這樣的代碼:
using System.Collections.Generic;
ICollection<int> getCollection() {
return new LinkedList<int>();
}
此方法返回LinkedList的一個實例,但其返回類型是ICollection。這意味着您可以使用getCollection()的返回值,因爲您可以使用ICollection,因爲LinkedList從ICollection繼承。如果返回類型是LinkedList,那麼只能使用LinkedList所在的返回類型,這會降低靈活性。
有時你想,因爲它是返回一個實現它的任何類的一般方法,返回的接口。您不必擔心返回的實際類是什麼,因爲您可以調用接口中的方法。
例如:
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
}
}
- 1. 接口中的方法返回動態
- 2. 返回的Java方法接口類型
- 3. 返回接口類型的Java方法
- 4. 內部接口方法返回類型
- 5. 方法返回一個接口
- 6. 默認方法返回值接口
- 7. 擴展方法,返回接口類型
- 8. 如果方法返回接口,返回什麼?
- 9. C#接口返回類型
- 10. C#方法,返回
- 11. C#方法返回
- 12. 接受方法返回空 - C#.NET MVC
- 13. 返回var的C#方法
- 14. 返回C#中的「功能接口」#
- 15. 實現接口vs返回實現接口的對象的方法
- 16. 如何從它實現的方法返回接口?
- 17. 重寫接口的方法返回類型
- 18. 調用接口方法C#
- 19. 的getMethods()返回的方法實現的通用接口
- 20. 在C#中實現作爲方法返回類型的類的接口類
- 21. UnitTesting不返回方法c#
- 22. C#方法返回公式
- 23. C++方法返回0
- 24. C#返回從方法
- 25. 如何實現返回類型爲Outer接口的嵌套接口方法?
- 26. 從C#方法返回方法
- 27. findViewById返回OnClickListener接口的OnClick方法的使用參數空
- 28. 工廠方法返回一個給定的接口的實現
- 29. 接口方法返回的ArrayList含有不同的對象
- 30. 實現接口方法返回類的類型參數的
我給你做一個接口,但後來我鑄造它...;) – 2010-11-27 17:13:21