Получить слот из содержащего объекта во вложенном объекте

У меня есть набор вложенных объектов, и мне нужно получить слот из содержащего объекта. Это можно сделать?

Пример:

Foo := Object clone do(
    a := "hello"

    Bar := Object clone do(
        b := Foo a  # How to get `Foo a` here?
    )
)

Из приведенного выше кода я получаю исключение во вложенном объекте Bar при доступе Foo:

Исключение: объект не отвечает на 'Foo'

Причина, по которой я хотел бы иметь их как вложенные объекты, заключается в том, что это облегчит (IMO) сделать приложение более модульным. Если бы это было возможно, я мог бы легко сделать что-то вроде

Foo := Object clone do(
    someSlot := "Some value"

    Bar := doRelativeFile("./folder/bar.io")
)

И в folder/bar.io использование Foo someSlot если нужно.

Подумайте, например, someSlot в качестве соединения с базой данных, и Bar как модель данных, нуждающаяся в этом соединении с базой данных.

1 ответ

Решение

Я решил, создав intialize метод во вложенном объекте, который принимает содержащий объект в качестве параметра и возвращает self (т.е. вложенный объект.

Таким образом, у меня может быть два файла как это:

  1. a.io

    Foo := Object clone do(
        foo := "foobar"
    
        Bar := doRelativeFile("./b.io") initialize(thisContext)
    )
    
  2. b.io

    Bar := Object clone do(
        initialize := method(parent,
            writeln("parent foo is ", parent foo)
            return self
        )
    )
    

Хотя это и не идеальное решение, оно должно работать достаточно хорошо для моих целей.

Другие вопросы по тегам