【问题标题】:Force Scala trait to implement a certain method强制 Scala trait 实现某个方法
【发布时间】:2013-07-24 22:44:06
【问题描述】:

有没有办法指定特征必须提供方法的具体实现?

给定一些混入

class A extends B with C {
  foo()
}

如果ABC 中的任何一个实现foo(),程序将编译。但是我们如何强制,例如,B 包含foo 的实现?

【问题讨论】:

    标签: scala mixins traits


    【解决方案1】:

    您可以执行以下操作:

    class A extends B with C {
      super[B].foo()
    }
    

    只有在B 实现 foo 时才会编译。但请谨慎使用,因为它(可能)引入了一些不直观的耦合。此外,如果A 覆盖foo,仍然会调用Bfoo

    恕我直言,一个有效的用例是conflict resolution

    trait B { def foo() = println("B") }
    trait C { def foo() = println("C") }
    class A extends B with C {
      override def foo() = super[B].foo()
    }
    

    如果你想确定B 声明 foo,你可以使用类型归属:

    class A extends B with C {
      (this:B).foo()
    }
    

    这只会在B 声明 foo 时编译(但它可能在CA 中实现)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 2015-10-05
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      相关资源
      最近更新 更多