【问题标题】:Scala trait as a function return typeScala trait 作为函数返回类型
【发布时间】:2018-03-04 17:50:09
【问题描述】:

如果我有特质 A 和 B

trait A {
  def funcA(a: Int): B
}

trait B {
  var bvariable: Int
  def funcB(b: Int): Int
}

上面有可能吗?如果是,我可以覆盖类中的函数,但是我如何初始化bvariable,因为我无法创建特征的实例,因此没有构造函数?

【问题讨论】:

  • 当你声明一个 trait 作为返回类型时,你返回的对象的类型实现了那个 trait,不多也不少,嗯?
  • 是什么阻碍了您实例化扩展B 的类的实例?例如。匿名类val x = new B { bvariable = 42; def funcB(i: Int) = i * ; } 的实例化按预期工作,您不需要构造函数。
  • 是不是就像Java接口一样,当有一个返回类型为接口的函数时,它返回一个实现该接口的类的对象?
  • @KseniaM 这有点像带有默认方法实现和变量的 Java 接口,但特性 compose quite differently。仍然不完全清楚您的实际问题是什么。

标签: scala oop traits


【解决方案1】:

当你声明一个特征时,实现它的类必须为特征的方法和其成员的值提供一个实现。例如 classB 可以像这样实现 trait B:

class classB extends B{
  override var bvariable: Int = 0

  override def funcB(b: Int): Int = {
    0
  }
}

如果你不提供 bvariable 的值,scala 编译器会抱怨不是所有的 trait 成员都已实现

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2014-05-29
    • 2020-08-19
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多