Как расширить класс Fantom, который реализует конструктор сериализации?

Мощной особенностью языка программирования Fantom является конструктор it-block, часто используемый в сериализуемых классах. К сожалению, я не могу найти документацию, достаточно подробную, чтобы сделать то, что я должен был сделать довольно просто: расширение класса, который объявляет этот тип конструктора. Лучшая документация, которую я нашел до сих пор, находится в этом посте, но не показывает пример того, что я пытаюсь сделать.

Допустим, у меня есть эти классы:

class Animal {
  protected const Str name
  new make( |This| f ) { f(this) }
  override Str toStr() { "I'm an Animal and my name is $name" }
}

class Main {
  Void main() {
    a := Animal {
      name = "Flipper"
    }
    echo( a )
  }
}

Пока все хорошо, он печатает: "Я животное, и меня зовут Флиппер". Теперь я хочу расширить Animal этим классом:

class Dog : Animal {
  override Str toStr() { "I'm an Dog and my name is $name" }
}

Но компилятор Fantom говорит:

Must call super class constructor in 'make'

Поэтому я изменил класс на:

class Dog : Animal {
  new make( |This| f ) : super( this ) { f(this) }
  override Str toStr() { "I'm an Dog and my name is $name" }
}

Но теперь компилятор жалуется:

invalid args make(|Playground::Animal->sys::Void|), not (Playground::Dog)

что имеет смысл, поскольку я передаю экземпляр Dog, а не Animal, так что же мне тогда передавать суперструктору?

1 ответ

Поразмыслив об ошибке компилятора, я понял, что все, что мне нужно было передать, это f:

class Dog : Animal {
  new make( |This| f ) : super( f ) { }
  override Str toStr() { "I'm an Dog and my name is $name" }
}

Я надеюсь, что это помогает другим.

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