尝试创建由@runtime决定的对象,我的情况类似:
class ZOO
feature
animals: LINKED_LIST[ANIMAL]
default_create
do
create animals.make
animals.extend(create {LION})
animals.extend(create {SERPENT})
animals.extend(create {BIRD})
end
open
local
l_sector: ZOO_SECTOR[ANIMAL]
do
across
animals as animal
loop
create {ZOO_SECTOR[animal.item.generating_type]} l_sector
end
end
在create {ZOO_SECTOR[animal.item.generating_type]} l_sector
上,编译器与我不同意,我尝试使用l_type: TYPE[ANIMAL]
和create {ZOO_SECTOR[l_type]} l_sector
都不起作用。
我有义务做类似的事情吗?对我来说,这与多态性的灵活性是矛盾的,我想我缺少一种机制/陈述
open
local
l_sector: ZOO_SECTOR[ANIMAL]
do
across
animals as animal
loop
if attached {LION} animal.item then
create {ZOO_SECTOR[LION]} l_sector
else if attached {SERPENT} animal.item then
create {ZOO_SECTOR[SERPENT]} l_sector
else
.....
end
end
答案 0 :(得分:1)
Eiffel类型系统依赖于类结构,并且该类结构在编译时是固定的。可能可以动态添加类型(例如,应该可以使用反射来提出解决方案),但这不能在语言本身中直接表达。
如果允许动物知道其动物园范围,则可以直接在动物类中编码ZOO_SECTOR
类型:
class ANIMAL feature ...
sector: ZOO_SECTOR [like Current] do create Result end
end
由于使用like Current
,因此无需在后代中添加任何新代码。该示例中的循环将变为
across
animals as animal
loop
l_sector := animal.item.sector
end
为ZOO_SECTOR [LION]
类型的项目提供LION
,等等。