创建动态对象(Eiffel)

时间:2016-01-06 14:46:13

标签: object if-statement eiffel

我必须找到一种动态创建对象的方法,这意味着用户可以在程序启动后决定要创建多少个对象。我试图做的是:

                if count = 6 then
                create player1.player
                create player2.player 
                create player3.player
                create player4.player
                create player5.player
                create player6.player
                  elseif count > 4 then
                    create player1.player
                    create player2.player 
                    create player3.player
                    create player4.player
                    create player5.player
                      elseif count > 3 then
                        create player1.player
                        create player2.player 
                        create player3.player
                        create player4.player
                          elseif count > 2 then
                            create player1.player
                            create player2.player 
                            create player3.player
                           else
                             create player1.player
                             create player2.player 
               end

一旦用户选择了玩家数量,变量计数就会更新,并且会调用创建对象的功能。

我使用了这种强力方法,而不是循环,因为我需要对象的“名称”,我必须在程序中再次调用它们。

无论如何编译器给我一个VEVI错误,变量没有正确设置。 一些帮助?

2 个答案:

答案 0 :(得分:1)

您有这个编译器错误,因为您的player1到player6被声明为附加(这是默认值)。如果在执行程序期间变量或属性可以为void,则必须将其声明为可分离。例如:

player1: detachable PLAYER

之后,每次要使用变量或属性时,都必须测试它的附件(即使你知道附件,编译器也不要这样):

if attached player1 as la_player1 then
    ...
    do_something_with(la_player1)
    ...
end

这样,编译器就会知道你使用了一个附加对象,并且在没有给你任何VEVI错误的情况下编译。

答案 1 :(得分:0)

如果所有变量playerN都是声明为附加的类的属性(如果类型为PLAYER,则可能是这种情况,前提是默认情况下附加类类型,或者类似于attached PLAYER的类型,否则它们都应该在创建过程结束时初始化。

假设某些属性可以是void,相应的类型声明应该看起来像detachable PLAYER

在示例中,有2个变量始终附加到对象,4个变量可能附加到对象,也可能不附加到对象。因此,他们需要声明为

player1, player2: PLAYER
player3, player4, player5, player6: detachable PLAYER

如果示例代码在创建过程中出现player1player2始终初始化

然后可以无保护地访问player1player2,但对于其他玩家,代码类似于

if attached player5 as p then
   p.whatever
end

将是必需的。

如果所有player属性都可以void,则所有属性都需要声明为detachable PLAYER