创建动态对象 (Eiffel)

Creating dynamic objects (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

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

我用的是这种暴力破解的方法,而不是循环,因为我需要对象的"names",所以在程序中又要调用它们

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

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

player1: detachable PLAYER

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

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

这样,编译器就会知道您使用了附加对象,并且会在不给您任何 VEVI 错误的情况下进行编译。

如果所有变量 playerN 都是声明为附加的 class 的属性(如果它们属于像 PLAYER 这样的类型,则可能是这种情况,前提是 class 类型是默认附加的,或者像 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.