0

我有一个名为 MAP 的课程:

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

我在地图光标内实现了新光标,它返回和

MAP_ITERATOR_CURSOR [KEY]

并将该可迭代游标传递给 KEYS 数组以进行迭代

我实现了MAP_ITERATOR_CURSOR [KEY]课程

 class MAP_ITERATOR_CURSOR [KEY]
       inherit ITERATION_CURSOR [KEY]

对于这个类,我实现了功能项:VAL但是因为该类是用它定义的,KEY所以我无法识别VAL如何让MAP_ITERATOR_CURSOR [KEY]项功能返回VAL与我们目前使用的键相关联的项?

知道MAP有一个名为 item 的函数,它获取键并返回VAL与该键相关联

item (k: KEY): VAL 
4

2 回答 2

3

一旦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}.itemtype 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. 可以从一开始就对类型的项目执行迭代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. KEY为方便起见,在 3中MAP_ITERATION_CURSOR保留了正式的泛型。如果可以通过某种方式访问​​ 的项目,则可以将其删除MAP,但这可能会引发与访问MAP、一致性和 CAT 调用相关的其他一些问题。因此,尽管它可能是可行的,但我不会去做。

于 2014-06-27T07:17:37.517 回答
0

为什么不使用 TABLE_ITERABLE [G,K] ?

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

于 2014-06-26T21:24:49.970 回答