我有一个名为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
答案 0 :(得分:2)
只要MAP [KEY, VAL]
继承ITERABLE [KEY]
,ITERATION_CURSOR
的通用参数就会绑定到KEY
。但是{ITERATION_CURSOR}.item
只是一个正常的功能,需要重新声明,重命名等。因此,有几种方法可以满足您的需求:
声明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
如果要求{MAP_ITERATOR_CURSOR}.item
的类型为VAL
,则第一种方法是使用与上述完全相同的代码,但重命名来自{{item
的功能1}}:
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
类型的项执行迭代。在这种情况下,VAL
的实际通用应为ITERABLE
:
VAL
客户端代码与案例2类似,但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
可能不可用:
key
在3中,across map as c loop
-- Use `c.item` of type VAL.
end
中的正式通用KEY
是为方便起见而保留的。如果有某种方法可以访问MAP_ITERATION_CURSOR
项,则可以将其删除,但这可能会引发与访问MAP
,一致性和CAT调用相关的其他一些问题。因此,虽然它可能是可行的,但我不会这样做。
答案 1 :(得分:0)
为什么不使用TABLE_ITERABLE [G,K]?
cf https://svn.eiffel.com/eiffelstudio/trunk/Src/library/base/elks/kernel/table_iterable.e