c# - 方法声明的返回类型应该是接口(interface)还是具体类?

标签 c# interface concreteclass

在一般情况下,接口(interface)或抽象类通常是合适的决定,对吗?

但在某些情况下,具体类看起来更好。例如,

public string Replace(string old, string new)

StringReplace 方法返回一个具体类。 (这只是一个例子,虽然 String 没有实现任何接口(interface)。)

我的问题是

  1. 什么时候返回接口(interface),什么时候返回具体类?

  2. 它是返回接口(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返回 IEnumerableTest2返回 IEnumerable 的具体实现接口(interface)(在这种情况下为 List)。最好的方法是什么? TestTest2

实际上,两者在语义上是不同的:

  • 作为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/

相关文章:

c# - Caliburn.Micro 和 Telerik WPF 控件

python - Python 界面如何工作(在 Twisted 中)?

python - f2py。 Fortran 子例程参数多行。 "unknown_subroutine"

ios - Objective-C中具体类和抽象类的区别

c# - 使用 Moq 模拟具体类方法的返回值

c# - 使用 System.Web.Mail 在 C# 中设置电子邮件附件名称

c# - 从 XML 中获取单个元素的高效方法 - C#

Java - 使用相同的方法和不同的返回类型实现多个接口(interface)

java - Java继承中 "override abstract methods"可以用 "implement abstract methods"代替吗?

c# - GeometryModel3D 面积和体积