powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как опредить тип элемента коллекции, если у них общий superclass
5 сообщений из 30, страница 2 из 2
Как опредить тип элемента коллекции, если у них общий superclass
    #37629124
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИсходная постановка задачи: нарисовать карту нас. пункта, причем нас. пункт не фиксирован, а имеет произвольную структуру. Я решил использовать паттерн Компоновщик. В последний момент попросили заимплементить функцию, которая отображает, сколько в агрегате всего деревьев (кроме них еще есть дома и пустыри)... в связи с этим возник топик

В принципе в вашем случае можно обойтись и instanceof, но когда он появляется хотя бы один раз, то провоцирует в дальнейшем на добавление еще одной ветки и т.п., не clean ООП. В вашем случае, предвидя, что вас скорее всего потом попросят добавить а сколько пустырей и сколько домов, то я бы сделал так.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class CompositeUtils{

public Collection<ISomeInterface> getAllInstancesOf(Class type, ISomeInterface composite){
     List<ISomeInterface> instances = ...
     for each instance for composite {
            if(instance.getClass().equals(type)){
                 instances.add(instance);
           }
     }
      return instances;
  }


public int getCountInstancesOf(Class type, ISomeInterface composite){
      return getAllInstancesOf(type, composite).size();
}

}
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629126
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, я бы в самом композите это и разместил
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629588
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖентосМне нужно, чтобы эта коллекция могла иметь представление в виде "составной объект – его части", и был реализован одинаковое обращение к этим элементам коллекции... но вот, получилось, что коллекцию надо перебрать "через один" в очень редком случае. Даже не знаю, как лучше поступить

Перебрать через один и сделать с элементами что?

Код: java
1.
2.
3.
4.
5.
for (ISomeInterface isi : list) {
  if (isi instanceof ClassA) {
    // Что тут нужно сделать особенного, нельзя ли это добавить в интерфейс для всех классов?
  } else if (...)
}


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

Либо же из этих исключительных классов можно сделать отдельный список, и передавать его уже в другой метод.
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629655
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTID,

У него составные объекты. Парент Чилд Парент Чилд :-)
...
Рейтинг: 0 / 0
Как опредить тип элемента коллекции, если у них общий superclass
    #37629689
pasha701
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если много операций подобного типа , и есть неприязнь к "instanceof", Visitor предпочтительее.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
import org.junit.Test;

public class VisitorTest {
    abstract class Parent {
        public abstract void accept(Visitor visitor);
    }

    class Tree extends Parent {
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }

    class Home extends Parent {
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }

    interface Visitor {
        void visit(Home value);
        void visit(Tree value);
    }

    class CountVisitor implements Visitor {
        int homeCount;
        int treeCount;

        @Override
        public void visit(Home value) {
            homeCount++;
        }

        @Override
        public void visit(Tree value) {
            treeCount++;
        }

        public int getHomeCount() {
            return homeCount;
        }

        public int getTreeCount() {
            return treeCount;
        }

    }

    @Test
    public void testVisitor() {
        CountVisitor visitor = new CountVisitor();
        Parent[] values = {new Tree(), new Home(), new Tree()};
        for (Parent value : values) {
            value.accept(visitor);
        }
        System.out.println("homes: " + visitor.getHomeCount() + ", trees: "
                        + visitor.getTreeCount());
    }

}


...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как опредить тип элемента коллекции, если у них общий superclass
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]