Как расширить класс 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" }
}
Я надеюсь, что это помогает другим.