1

Eiffel Studio中,我一直在尝试访问我从另一个类定义的类的对象的字段。但是,它不断给出我无法理解和解决的错误。以下是示例代码片段:

正在创建对象的类:

class
    TEST1

feature
    object: TEST2
        -- object of type TEST2
    function(val: INTEGER)
            -- Assign
        do
            object.value:=val
        end
end

正在创建对象的类:

class
    TEST2

feature 
    value: INTEGER
end

错误信息如下:

Error code: VBAC(2)

Error: target of assigner call has no associated assigner command.
What to do: add an assigner mark to the declaration of the target feature or use a dot form of a call.

Class: TEST1
Feature: function
Line: 10
      do
->      object.value:=val
      end

Error code: VEVI

Error: variable is not properly set.
What to do: ensure the variable is properly set by the correspondig setter instruction.

Class: TEST1
Source class: ANY
Feature: default_create
Attribute(s): object
Line: 331
      do
->    end

看来赋值语句有问题。但是,我一直无法理解出了什么问题。

这些类已在同一项目的同一集群下的不同文件中定义。我是埃菲尔的新手,所以我不知道这是否是问题所在。

谢谢你。

4

1 回答 1

2

在 Eiffel 中,每个属性都被视为只读。这消除了创建 getter 的需要,就像您在其他语言(如 Java)中所做的那样。要使用“:=”语法为属性分配值,您将需要一个分配器。这里有一个例子:

class
    TEST2

feature
    value:INTEGER assign set_value

    set_value(a_value:INTEGER)
        do
            value := a_value
        end
end

然后,您将能够使用该行:

object.value:=val

对于第二个错误,默认情况下,EiffelStudio 就是我们所说的 Void Safe。这是一种确保不被视为“可分离”的属性永远不会为 Void 的机制(类似于其他语言中的 NULL)。默认情况下,每个类都有一个名为“default_create”的默认构造函数,这个构造函数不做任何事情。您需要做的是在 {TEST1} 类中创建自己的构造函数,以实例化其中的每个属性。这是一个例子:

class
    TEST1

create
    make

feature
    make
        do
            create object
        end

    object: TEST2
        -- object of type TEST2
    function(val: INTEGER)
            -- Assign
        do
            object.value:=val
        end
end

在前面的示例中,我创建了一个方法调用 make,指定该方法是构造函数,并且在此方法中,我确保对象属性正确实例化。

于 2016-11-04T14:38:00.887 回答