在一般情况下,接口(interface)或抽象类通常是合适的决定,对吗?
但在某些情况下,具体类看起来更好。例如,
public string Replace(string old, string new)
String
的Replace
方法返回一个具体类。 (这只是一个例子,虽然 String 没有实现任何接口(interface)。)
我的问题是
什么时候返回接口(interface),什么时候返回具体类?
它是返回接口(interface)的
程序的一部分,而不是实现
吗?
最佳答案
视情况而定。
这个问题我已经看过好几次了,这里有一个很好的例子来说明“视情况而定”的答案。
考虑以下类:
public class MyClass
{
public static IEnumerable<int> Test()
{
return new List<int> { 2, 3, 4 };
}
public static List<int> Test2()
{
return new List<int> { 2, 3, 4 };
}
}
Test
返回 IEnumerable
和 Test2
返回 IEnumerable
的具体实现接口(interface)(在这种情况下为 List
)。最好的方法是什么? Test
或 Test2
?
实际上,两者在语义上是不同的:
- 作为
Test
只返回IEnumerable
,它暗示它是方法契约的一部分开发人员在枚举中使用返回的对象 (foreach
)。 - 作为
Test2
返回List
例如,它允许用户访问List
的对象按指数。这是对返回对象的完全不同的利用。
private static void Main(string[] args)
{
foreach (var z in MyClass.Test())
{
Console.WriteLine(z);
}
var f = MyClass.Test2()[0];
Console.ReadKey();
}
如果您希望开发人员仅在枚举中使用返回的对象,那么您可以使用接口(interface)作为返回类型。如果您希望开发人员使用接口(interface)具体实现的方法/属性(在上面的示例中,通过索引访问对象),那么您可以返回一个具体类型。
另请记住,有时您别无选择。例如,如果您想公开应该用于 Silverlight 绑定(bind)的公共(public)集合,那么您应该返回 ObservableCollection<T>
, 不是 IEnumerable<T>
,因为绑定(bind)系统实际上需要 ObservableCollection
的方法/属性/行为类(IEnumerable
不足以使绑定(bind)正常工作)。
您应该避免的是返回 IEnumerable<T>
的方法。与 ToList()
一起使用每次。
关于c# - 方法声明的返回类型应该是接口(interface)还是具体类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9598441/