2016-04-12 225 views
0

比方说,我们已经有了内部类(代码的其余部分是不是真的很重要我猜,DataStructureIterator只是通过java.util.Iterator<Integer>扩展接口):Java接口VS类的返回类型

private class EvenIterator implements DataStructureIterator

现在我们要创建一个返回EvenIterator的新实例的方法。当我发现我们能做到以不同的方式:

  1. public EvenIterator getEvenIterator(){return new EvenIterator();}
  2. public DataStructureIterator getEvenIterator() {return new EvenIterator();}

我发现代码的两个版本编译好,但我只是不能有什么区别(如果有的话)和应该使用哪个版本。

+0

这是OOP的核心原理。你可以找到书籍,博客文章,视频和更多的回答这个问题比你所希望的更详细。尝试搜索“多态性”。 – Sam

+0

@Sam我正在从oracle教程学习,多态部分还没有,所以我分析的例子,我无法得到它。我会阅读有关它,谢谢! – Kubekk

回答

1

这取决于。如果你的方法契约是你说你正在返回某种迭代器(即不是特定的实现),那么返回接口。换句话说,你的合同说“除了迭代整数的能力之外,不要假设任何其他行为/功能”。这样做的好处是,您可以稍后将其他底层实现替换掉。呼叫者不要也不应该在意。另一方面,如果你的方法的合同是你返回一个迭代器,那么特别是提供了只能遍历甚至整数的能力,返回EvenIterator。这必然意味着你不能将实现交换出去(甚至不会迭代甚至整数),这样做意味着打破/改变合同。您可以进一步抽象并自己制作一个接口,并为迭代器提供不同的实现(可能是迭代一个内部链表,另一个遍历内部数组,或者您可以提供迭代特定类型的偶数的能力;例如,2对幂或4的幂)。

+0

在这两种情况下,return语句都是'new EvenIterator()'。将返回类型定义为接口< - 是否意味着我们实际上不返回类,而只是从可以迭代的函数(类的方法)接口中删除?作为返回'新的EvenIterator()'我虽然返回类型必须是相同的,但如示例所示,它必须是接口,对吗? – Kubekk

+0

接口返回类型是因为'EvenIterator'实现接口。我不确定你的意思是“从功能(类的方法)中删除”;实际的实例本身将被返回。只是从调用代码的角度来看,如果返回类型是接口,那么它不能假定更多关于返回值的内容,因为那是方法的返回类型。例如,您不能调用仅在'EvenIterator'上定义的公共方法,因为它不是接口的一部分。 –

+0

谢谢,那正是我的意思。我写了一些代码,实际上它就是这样工作的。 – Kubekk