Eiffel:在运行时创建类型化对象

Posted

技术标签:

【中文标题】Eiffel:在运行时创建类型化对象【英文标题】:Eiffel: create at runtime a typed object 【发布时间】:2018-10-29 14:20:39 【问题描述】:

试图创建一个由@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

【问题讨论】:

【参考方案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

LION 等类型的项目提供ZOO_SECTOR [LION]

【讨论】:

Thx,可能是一个比 switch 结构更丑的解决方案,具体取决于 ANIMAL 的所有后代。有时动物不知道他会进入动物园,但可以说我们会在进入之前给他这个标签,让我们形成一个 ZOOABLE_ANIMAL ;-)

以上是关于Eiffel:在运行时创建类型化对象的主要内容,如果未能解决你的问题,请参考以下文章

编程思想14.类型信息

Java笔记:运行时

为 T 已知运行时反射地创建 Seq[T]

JavaSE Class 类详解

Eiffel:转换方法在代理调用参数的情况下是不是有效?

Class.forName()的作用与使用总结