如何扩展实现序列化构造函数的Fantom类?

时间:2015-12-08 10:19:58

标签: fantom

Fantom编程语言的一个强大功能是it-block constructor,通常用于可序列化的类中。不幸的是我找不到足够详细的文档来做我应该很简单的事情:扩展一个声明这种类型的构造函数的类。到目前为止,我发现的最好的文档是this post,但没有显示我正在尝试做的例子。

假设我有这些课程:

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 )
  }
}

到目前为止,它打印出来:“我是动物,我的名字是Flipper”。现在我想用这个类扩展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 个答案:

答案 0 :(得分:1)

在更多地考虑编译器错误后,我意识到我必须通过的所有内容都是f:

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

我希望这有助于其他人。