2014-06-26 35 views
0

我有一个类称为MAP:Eiffel MAP上的Iterable实现?

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具有采取一个函数调用项目键并返回与该键

item (k: KEY): VAL 

回答

2

只要MAP [KEY, VAL]继承ITERABLE [KEY],的ITERATION_CURSOR通用参数绑定到KEY。然而{ITERATION_CURSOR}.item仅仅是一个正常的特点,那就是受重声明,重命名等,因此几种方法能适合您的需要:

  1. 声明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}.itemVAL类型,第一种方式是使用完全相同的代码之上,但重命名功能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. 的迭代可以从一开始就对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正式通用KEYMAP_ITERATION_CURSOR为了方便而保留。如果有某种方式可以访问MAP的项目,则可以将其删除,但这可能会引起与访问MAP,一致性和CAT-calls有关的其他一些问题。因此,尽管这可能是可行的,但我不会为此付出代价。

+0

这是一个非常棒的解决方案,非常感谢 –