继承和Iterable

时间:2011-09-06 15:52:52

标签: java inheritance iterable

public interface IPowerList<T> extends Iterable< T > {

public int bitFlag(List<T> subseq);
}

public class PowerList<T> implements IPowerList<T>{

private List<T> originalList;
private Set<Set<T>> powerList= new HashSet<Set<T>>();

@Override
public Iterator<T> iterator() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int bitFlag(List<T> subseq) {
    // TODO Auto-generated method stub
    return 0;
}

}  

Eclipse自动给我实现iterator的覆盖方法。

(1)是因为我实现了一个从iterable扩展的接口吗?

(2)我的私有变量是集合和列表 - 它们有自己的迭代器,我不需要定义任何新的迭代器 - 所以我该怎么办?我应该删除继承吗?

(3)我们什么时候需要定义一个新的迭代器?当我们定义一个类,它是我们的集合?但我想知道为什么,因为我们总是使用一个通用的集合,它们有自己的迭代器。你能给我一个例子吗?

(4)如果我添加一组new HashSet<T>(),您会考虑添加空列表,还是添加new HashSet().add(null)会被视为空列表?

2 个答案:

答案 0 :(得分:2)

  

(1)是因为我实现了一个从iterable扩展的接口吗?

是的,您获得了iterator()方法,因为您的界面扩展了Iterable。这意味着任何实现接口的类都必须实现Iterable的所有方法。如果您不想这样做,请不要展开Iterable

  

(2)我的私有变量是集合和列表 - 它们都有自己的变量   迭代器,我不需要定义任何新的迭代器 - 所以我该怎么做   做?我应该删除继承吗?

您的私有成员不可用于您的类的使用者,因此您需要一种方法来公开这些迭代器。你如何做到这一点取决于你,但通过你的iterate()方法这样做很有意义。

  

(3)我们什么时候需要定义一个新的迭代器?当我们定义一个类   它对我们来说是一种收藏?但我想知道为什么,因为我们总是   使用通用集合,它们有自己的迭代器。你可以给   我举个例子?

如果您创建自己想要可迭代的集合,但这不会扩展已经实现Iterable的集合,那么您将需要创建自己的迭代器。如果你不在乎,那就没有必要了,尽管你的消费者可能会有不一样的感受。

答案 1 :(得分:0)

(1)是,自PowerList<T> implements IPowerList<T>起,它必须实施Iterator<T> iterator()(或返回Iterator<T>的子类型。)

(2)将继承保留为Iterable<T>,这样就可以封装你的字段(它们都是私有的)并且只导出Iterator。其次,您可以决定导出哪个和哪种迭代器,并且将来更灵活(例如,更改枚举的顺序)。最后,如果与Iterations无关(在我看来就是这样),你可以考虑不为你的IPowerList扩展Iterable,而是让PowerList实现两个接口(在Java中允许在接口上进行多重继承)。

(3)例如,当你撰写一个新的收藏品时,例如你的一套。或者当您想要改变迭代器的行为方式时,例如枚举的顺序或迭代器是否可以添加和删除元素。例如,我有一个树结构,可以返回一堆不同的迭代器(并实现Iterator和几个类似的接口)。