首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展实现序列化构造函数的Fantom类?

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

Stack Overflow用户
提问于 2015-12-08 18:19:58
回答 1查看 80关注 0票数 1

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

假设我有这些类:

代码语言:javascript
复制
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:

代码语言:javascript
复制
class Dog : Animal {
  override Str toStr() { "I'm an Dog and my name is $name" }
}

但是Fantom编译器说:

代码语言:javascript
复制
Must call super class constructor in 'make'

因此,我将类更改为:

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

但是现在编译器抱怨:

代码语言:javascript
复制
invalid args make(|Playground::Animal->sys::Void|), not (Playground::Dog)

这是有意义的,因为我传递的是Dog实例,而不是Animal,那么我应该向超级构造函数传递什么呢?

EN

回答 1

Stack Overflow用户

发布于 2015-12-08 18:26:55

在仔细考虑了一下编译器错误后,我意识到我必须传递的所有内容都是f:

代码语言:javascript
复制
class Dog : Animal {
  new make( |This| f ) : super( f ) { }
  override Str toStr() { "I'm an Dog and my name is $name" }
}

我希望这对其他人有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34153335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档