繁体   English   中英

为什么Trait使用非空构造函数编译扩展Abstract Class?

[英]Why a Trait extending Abstract Class with non-empty constructor compiles?

特征不能有构造函数参数。 那么如何编写一个扩展和抽象类具有非空构造函数的特征呢?

abstract class HasConsArgs(val i: Int)
trait Test extends HasConsArgs

哪个编译。 但是在尝试使用时;

new Test {}

你得到一个错误, not enough arguments for constructor HasConsArgs: ...为什么会这样,是否有可能有一个trait的实现者以某种方式调用这个构造函数?

class Impl(i: Int) extends Test //doesnt work 

失败并error: not enough arguments for constructor HasConsArgs: (i: Int)HasConsArgs. 这意味着我可能需要让Impl扩展HasConsArgs抽象类......

在您的情况下,您无法使用Test创建匿名类,因为您无法指定超级构造函数参数,如您所见。

如果特征扩展了一个类,那么混合特征的所有类必须是该类的子类或该类的后代类。

class A
class B extends A
class C
trait D extends A
class E extends D
class F extends A with D
class G extends B with D
class H extends C with D   // fails

为了混合Test特性,你可以写

class Impl(i: Int) extends HasConstArgs(i) with Test

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM