2010-11-27 142 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 
    } 
}