我对返回接口的方法的概念有点困惑。是否有一篇文章或参考文献详细讨论了这个问题?我很困惑你何时/为什么要这样做,以及如何将接口转换为与之关联的对象(我认为是正确的)。
答案 0 :(得分:14)
我很想知道你何时/为什么要这样做,
当你想要从具体实现(它是如何做的)中分离出应该做什么的契约时,返回一个接口是很好的。拥有一个界面可以让您更轻松地重用和修改代码。
如果您有一个接口IFoo
和一个以天真的方式实现SimpleFoo
的实现IFoo
,您可以针对该接口进行编程并获得基本功能。稍后您可以创建一个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.
}
答案 1 :(得分: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
}
}
答案 2 :(得分:0)
我不确定是什么令人困惑。接口基本上等同于没有非抽象方法且没有声明状态(字段)的抽象类。所以返回一个接口就像返回一个抽象基类。
你想要返回一个接口的原因是接口代表了一小部分功能而不是完整的对象。一个典型的例子是返回IEnumerable而不是List,因为即使底层对象可能是一个列表,该方法实际上只是返回一组有序的对象,这是调用者应该看到的全部内容。将来,该方法可能会返回一个数组或一些其他数据结构。但是对调用者来说无关紧要,因为所有调用者看到的都是IEnumerable。这遵循编程到接口而不是实现的一般原则。
答案 3 :(得分:0)
方法无法返回接口本身。接口是对象应实现的方法的描述。您无法返回对象需要的方法列表。
您可以做的是返回接口的实例。采用如下代码:
using System.Collections.Generic;
ICollection<int> getCollection() {
return new LinkedList<int>();
}
此方法返回LinkedList的实例,但其返回类型为ICollection。这意味着您可以使用getCollection()的返回值,只要您可以使用ICollection,因为LinkedList继承自ICollection。如果返回类型是LinkedList,则只能使用期望LinkedList的返回类型,从而降低了灵活性。