наследование и повторяемость - PullRequest
0 голосов
/ 06 сентября 2011
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) Это потому, что я реализую интерфейс, расширяемый от итеративного?

(2) Мои личные переменные - это наборы и списки - у них есть свои собственные итераторы, мне не нужно определять какой-либо новый итератор - так что мне делать? я должен стереть наследство?

(3) когда нам нужно определить новый итератор? когда мы определяем класс, который является для нас своего рода коллекцией? но мне интересно, почему, потому что мы всегда используем универсальные коллекции, которые имеют свои собственные итераторы ... Можете ли вы привести пример?

(4) если я добавлю к набору наборов new HashSet<T>(), рассмотрите ли вы его для добавления пустого списка или добавления new HashSet().add(null) будет считаться пустым списком?

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

(1) Это потому, что я реализую интерфейс, расширяемый от итеративного?

Да, вы получаете метод iterator(), потому что ваш интерфейс расширяет Iterable. Это означает, что любой класс, который реализует ваш интерфейс, должен также реализовать все методы Iterable. Если вы этого не хотите, не расширяйте Iterable.

(2) Мои личные переменные - это наборы и списки - у них есть свои итераторы, мне не нужно определять какой-либо новый итератор, так что я должен делать? я должен стереть наследство?

Ваши частные члены не доступны для пользователей вашего класса, поэтому вам нужен способ разоблачения этих итераторов. То, как вы это делаете, зависит от вас, но делать это с помощью метода iterate() имеет большой смысл.

(3) когда нам нужно определить новый итератор? когда мы определяем класс что это для нас какая-то коллекция? но мне интересно почему, потому что мы всегда использовать общие коллекции, которые имеют свои собственные итераторы .. Можете ли вы дать мне пример?

Если вы создаете свою собственную коллекцию, которую хотите сделать итеративной, но которая не расширяет коллекцию, которая уже реализует Iterable, то вам нужно будет создать свой собственный итератор. Если вам все равно, то в этом нет необходимости, хотя ваши потребители могут чувствовать себя иначе.

0 голосов
/ 06 сентября 2011

(1) Да, поскольку PowerList<T> implements IPowerList<T>, он должен реализовывать Iterator<T> iterator() (или возвращать подтип Iterator<T>).

(2) Оставьте наследование равным Iterable<T>, чтобы вы могли инкапсулировать свои поля (они в любом случае являются частными) и экспортировать только итератор. Во-вторых, вы можете решить, какой и какой итератор вы экспортируете, и будете более гибкими в будущем (например, измените порядок перечисления). Наконец, вы можете подумать о том, чтобы не расширять Iterable для вашего IPowerList, если это не имеет ничего общего с Iterations (мне так кажется), а вместо этого заставить PowerList реализовывать оба интерфейса (множественное наследование на интерфейсах разрешено в Java).

(3) Например, когда вы создаете новую коллекцию, например, ваш набор наборов. Или когда вы хотите изменить поведение итератора, например, порядок перечисления или может ли итератор добавлять и удалять элементы. Например, у меня есть древовидная структура, которая может возвращать кучу разных итераторов (и реализует итератор и несколько похожих интерфейсов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...