【问题标题】:inheritance and Iterable继承和可迭代
【发布时间】:2011-09-06 15:52:51
【问题描述】:
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&lt;T&gt;() 添加到一组集合中,您会考虑将其添加为空列表还是添加 new HashSet().add(null) 将被视为空列表?

【问题讨论】:

    标签: java inheritance iterable


    【解决方案1】:

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

    是的,你得到了iterator() 方法,因为你的接口扩展了Iterable。这意味着任何实现你的接口的类也必须实现Iterable 的所有方法。如果您不希望这样,请不要扩展 Iterable

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

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

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

    如果您创建自己的集合并希望可迭代,但不扩展已经实现 Iterable 的集合,那么您需要创建自己的迭代器。如果您不在乎,则没有必要,尽管您的消费者可能会有不同的感受。

    【讨论】:

      【解决方案2】:

      (1) 是的,由于PowerList&lt;T&gt; implements IPowerList&lt;T&gt;,它必须实现Iterator&lt;T&gt; iterator()(或返回Iterator&lt;T&gt; 的子类型)。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 2014-07-18
        • 2016-04-22
        • 2019-09-14
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多