5

我有一个类方法,它返回一个我可以遍历的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。但是,据我了解,界面更适合这种类型的操作。哪个是最好的界面?另外,为什么返回一个接口而不是实现(比如 ArrayList 对象)更好?对我来说,这似乎还有很多工作。

4

11 回答 11

4

就个人而言,我会使用List <Employee> 在后端创建列表,然后在返回时使用IList 。当您使用接口时,它为您提供了更改实现的灵活性,而无需更改谁在使用您的代码。如果您想坚持使用 ArrayList,那将是一个非泛型IList

于 2008-08-27T18:14:52.660 回答
2

@杰森

你也可以返回 IList<> 因为数组实际上实现了这个接口。

于 2008-08-27T18:17:56.430 回答
1

像你说的那样,最好的方法是返回一个 List,最好使用泛型,所以它是 List <Employee>。

返回 List 而不是 ArrayList 意味着如果以后您决定使用 LinkedList,您不必更改任何代码,除了创建对象开始的位置(即调用“new数组列表())”。

于 2008-08-27T18:15:33.487 回答
1

如果您所做的只是遍历列表,您可以定义一个将列表返回为 IEnumerable(对于 .NET)的方法。

通过返回仅提供您需要的功能的接口,如果将来出现更好/更快/更好匹配您的应用程序的新集合类型,只要它仍然实现 IEnumerable 您可以完全重写您的方法,使用它里面的新类型,而不更改任何调用它的代码。

于 2008-08-27T18:20:34.910 回答
1

是否有任何理由需要订购该系列?为什么不简单地返回一个IEnumerable<Employee>?这给出了所需的最低限度 - 如果您以后想要某种其他形式的存储,例如袋子或集合或树或诸如此类的东西,您的合同将保持不变。

于 2008-08-27T18:31:21.437 回答
1

我不同意返回接口更好的前提。我的原因是您希望最大化给定代码块的有用性。

考虑到这一点,接口可用于接受项目作为参数。如果函数参数调用数组或 ArrayList,那是您唯一可以传递给它的东西。如果函数参数调用 IEnumerable,它将接受其中一个以及许多其他对象。它更有用

然而,返回值则相反。当您返回一个 IEnumerable 时,您唯一能做的就是枚举它。如果您有一个方便的 List 并返回它,那么调用您的函数的代码也可以轻松地执行许多其他操作,例如获取计数。

不过,我支持那些建议您远离 ArrayList 的人。泛型要好得多。

于 2008-08-27T18:35:15.110 回答
0

您的方法的返回类型应该是IList<Employee>.

这意味着您的方法的调用者可以使用任何IList提供但不能使用特定于ArrayList. 然后,如果您在某些时候觉得LinkedListYourCustomSuperDuperList提供更好的性能或其他优势,您可以在您的方法中安全地使用它,而不是搞砸它的调用者。

这大致是接口 101。;-)

于 2008-08-27T18:16:28.477 回答
0

接口是实现与实现用户之间的契约。

通过使用接口,您允许实现随心所欲地更改,只要它维护用户的合同。

它还允许多个实现使用相同的接口,以便用户可以重用与接口交互的代码。

于 2008-08-27T18:17:27.570 回答
0

你没有说你在说什么语言,但是在 .NETish 中,返回一个 IList 比返回一个 List 甚至一个 ArrayList 没有更多的工作,尽管仅仅提到那个过时的类就让我觉得你是不是在谈论.NET。

于 2008-08-27T18:17:51.280 回答
0

接口本质上是一个类具有某些方法或属性的契约;编程到接口而不是直接实现允许更动态和可管理的代码,因为只要“合同”仍然存在,您就可以完全交换实现。

在您描述的情况下,传递接口并没有给您带来特别的优势,如果是我,我会传递具有泛型类型的 ArrayList,或者传递 Array 本身:list.toArray()

于 2008-08-27T18:23:04.390 回答
0

实际上,如果那是一个框架,您不应该返回一个列表,至少不要不考虑它,推荐使用的类是一个集合。List 类以服务器可扩展性问题为代价进行了一些性能改进。这实际上是 FXCop 规则。

你有这篇文章的理由

于 2008-08-27T18:31:59.407 回答