我在谈论Java,但这个概念适用于其他语言 -
我们在同一个类上有两个方法具有相同的基本功能,但提供不同的返回类型。这两种方法都可以获得所有的东西,但是一个可以获得可以访问所有东西的迭代,一个获得包含所有东西的集合。
我们知道你不能这样做(因为它不会编译):
Iterable getThings()
Collection getThings()
那么,有没有人想过如何命名方法?这似乎很容易解决:
Iterable getIterableOfThings
Collection getCollectionOfThings
然而,这显然有点冗长,也许不是最好的解决方案。我问的问题是否暗示我们的组织/编码方法不合时宜,或者这是一个有效的问题?
还有其他人处理过这种情况吗?
答案 0 :(得分:2)
怎么样:
Iterable getIterator();
Collection getThings();
答案 1 :(得分:1)
Iterable is a superinterface of Collection.一般来说,不应该需要这样做。
尽管如此,这个问题本身也是有效的。一个更好的例子是,当你有一个底层资源,一个函数将它包装在一个访问对象中,第二个函数包装在另一个访问对象中。当然,这取决于编码风格,但我习惯于看到这样的东西(从而发现它更具可读性):
class A {
private Object[] underlying;
List<Object> getItemsAsList() {
return Arrays.asList(underlying);
}
Object[] getItemsAsArray() {
return underlying;
}
}
答案 2 :(得分:0)
Iterable getThings()似乎不正确,因为你实际上没有得到任何东西。 Iterable提供对一组项目进行迭代的访问,但不会为您提供这些项目。
一个集合会给你那些项目,所以Collection getThings()似乎是正确的。
例如,您可以为无限长的集合赋予迭代器,但不能给出这样的等效集合。这可以工作,因为迭代器会在时间返回一个元素,但是集合需要收集无限量的对象并返回它们。