为什么使用非空构造函数扩展 Abstract Class 的特征可以编译?
Why a Trait extending Abstract Class with non-empty constructor compiles?
特征不能有构造函数参数。那么如何编写一个具有非空构造函数的扩展和抽象特征 class 呢?
abstract class HasConsArgs(val i: Int)
trait Test extends HasConsArgs
编译。但是当尝试使用时;
new Test {}
你得到一个错误not enough arguments for constructor HasConsArgs: ...
...为什么会这样,是否可以让特征的实现者以某种方式调用这个构造函数?
class Impl(i: Int) extends Test //doesnt work
因 error: not enough arguments for constructor HasConsArgs: (i: Int)HasConsArgs.
失败,这意味着我可能需要 Impl
扩展 HasConsArgs
摘要 class...
在您的情况下,您无法使用 Test
创建匿名 class,因为您无法指定超级构造函数参数,如您所见。
如果特征扩展了 class,所有混入该特征的 class 必须是 class 的子class 或 class 的后代 class class.
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
为了mixin Test
trait,你可以这样写
class Impl(i: Int) extends HasConstArgs(i) with Test
特征不能有构造函数参数。那么如何编写一个具有非空构造函数的扩展和抽象特征 class 呢?
abstract class HasConsArgs(val i: Int)
trait Test extends HasConsArgs
编译。但是当尝试使用时;
new Test {}
你得到一个错误not enough arguments for constructor HasConsArgs: ...
...为什么会这样,是否可以让特征的实现者以某种方式调用这个构造函数?
class Impl(i: Int) extends Test //doesnt work
因 error: not enough arguments for constructor HasConsArgs: (i: Int)HasConsArgs.
失败,这意味着我可能需要 Impl
扩展 HasConsArgs
摘要 class...
在您的情况下,您无法使用 Test
创建匿名 class,因为您无法指定超级构造函数参数,如您所见。
如果特征扩展了 class,所有混入该特征的 class 必须是 class 的子class 或 class 的后代 class class.
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
为了mixin Test
trait,你可以这样写
class Impl(i: Int) extends HasConstArgs(i) with Test