2014-06-26 7 views
0

У меня есть класс, называемый MAP:Реализация Eiffel Iterable на MAP?

class MAP [KEY,VAL] 
     inherit ITERABLE [KEY] 

Я реализовал новый курсор внутри курсора карты, которая возвращает и

MAP_ITERATOR_CURSOR [KEY] 

и передает, что итерация курсора массив КЛЮЧЕЙ перебирать

Я внедрил MAP_ITERATOR_CURSOR [KEY] класс

class MAP_ITERATOR_CURSOR [KEY] 
     inherit ITERATION_CURSOR [KEY] 

для этого класса Я реализовал этот признак: VAL, но поскольку класс был определен с KEY, он не узнает VAL как мне получить MAP_ITERATOR_CURSOR [KEY] элемент, возвращающий VAL, связанный с ключевым ключом, который мы сейчас находимся?

Зная, что MAP имеет функцию под названием элемент, который взять ключ и возвращает VAL, связанный с этим ключом

item (k: KEY): VAL 

ответ

2

Как только MAP [KEY, VAL] наследует ITERABLE [KEY], общий параметр ITERATION_CURSOR связан с KEY. Однако {ITERATION_CURSOR}.item просто нормальная функция, которая подлежит переопределение, переименование и т.д. Поэтому несколько подходов может соответствовать вашим потребностям:

  1. Declare MAP_ITERATOR_CURSOR иметь два официальных дженерики и объявить {MAP}.new_cursor следующим образом:

    class MAP [KEY, VAL] inherit ITERABLE [KEY] feature 
        new_cursor: MAP_ITERATOR_CURSOR [KEY, VAL] 
         do 
          create Result.make (Current) 
         end 
    end 
    
    class MAP_ITERATOR_CURSOR [KEY, VAL] inherit ITERATION_CURSOR [KEY] 
    create make 
    feature 
        make (t: like target) 
         do 
          target := t 
         end 
        target: MAP [KEY, VAL] 
        item: KEY ... 
        value: VAL 
         do 
          Result := target.item (item) 
         end 
    end 
    

    Затем клиентский код может выглядеть

    across map as c loop 
        -- Use `c.item` of type KEY. 
        -- Use `c.value` of type VAL. 
    end 
    
  2. Если требуется, чтобы {MAP_ITERATOR_CURSOR}.item имеет тип VAL, первый способ заключается в использовании точно такой же код, как описано выше, но переименовать функцию item, которая приходит от ITERABLE:

    class MAP_ITERATOR_CURSOR [KEY, VAL] inherit 
        ITERATION_CURSOR [KEY] rename item as key end 
    ... 
        key: KEY ... 
        item: VAL 
         do 
          Result := target.item (key) 
         end 
    end 
    

    Затем клиентский код может выглядеть

    across map as c loop 
        -- Use `c.item` of type VAL. 
        -- Use `c.key` of type KEY. 
    end 
    
  3. The итерация может выполняться над предметами типа VAL с самого начала. В этом случае фактические общие из ITERABLE должна быть VAL:

    class MAP [KEY, VAL] inherit ITERABLE [VAL] feature 
        new_cursor: MAP_ITERATOR_CURSOR [KEY, VAL] 
         do 
          create Result.make (Current) 
         end 
    end 
    
    class MAP_ITERATOR_CURSOR [KEY, VAL] inherit ITERATION_CURSOR [VAL] 
    create make 
    feature 
        make (t: like target) 
         do 
          target := t 
         end 
        target: MAP [KEY, VAL] 
        item: VAL 
         do 
          Result := target.item (key) 
         end 
        key: KEY 
          -- This feature can be not exported, or even not present 
          -- as soon as `item` can be implemented. 
    end 
    

    клиентского код аналогичен случаю 2, но key может быть недоступен:

    across map as c loop 
        -- Use `c.item` of type VAL. 
    end 
    
  4. В 3 формальных родовом KEY в MAP_ITERATION_CURSOR хранится для удобства.Его можно удалить, если есть доступ к элементам MAP, но это может вызвать некоторые другие проблемы, связанные с доступом к MAP, соответствиям и CAT-вызовам. Поэтому, хотя это потенциально возможно, я бы не пошел на это.

+0

Это отличное решение, благодаря которому –

0

Почему не используется TABLE_ITERABLE [G, K]?

ср https://svn.eiffel.com/eiffelstudio/trunk/Src/library/base/elks/kernel/table_iterable.e

+0

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