gpt4 book ai didi

scala - 如何覆盖类型成员向其添加更多混入

转载 作者:行者123 更新时间:2023-12-04 17:40:33 24 4
gpt4 key购买 nike

通过例子更容易解释。我有一个 Base定义类型的特征 Rec :

trait A
trait B
trait C

trait Base {
type Rec <: A
def foo(r: Rec): Rec = ???
}

现在我想为 Base 创建“丰富器”在覆盖方法上使用抽象覆盖修饰符添加一些功能,同时使类型 Rec更具体(取决于具体丰富者执行的任务):
trait Enricher1 extends Base {
override type Rec <: Base#Rec with B
abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}

trait Enricher2 extends Base {
override type Rec <: Base#Rec with C
abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}

问题是:我不能将我的浓缩器混合在一起:
trait Concrete extends Base
trait Custom extends Concrete with Enricher1 with Enricher2

编译器基本拒绝这种说法 RecEnricher1RecEnricher2是不相容的,我非常同意他的看法。请注意,它确实使用单个浓缩器进行编译。

所以,而不是写
override type Rec <: Base#Rec with B

我宁愿说:给我与 Rec 相同的类型,但添加 with X到它。我试过
override type Rec <: super.Rec with B

但它也被编译器拒绝,并出现“循环别名”错误。

我怎样才能做到这一点?

最佳答案

如果我正确理解您要做什么,那么我认为可以这样做:

trait A
trait B
trait C

trait Base {
type Rec <: A
def foo(r: Rec): Rec = ???
}

trait Enricher1 extends Base {
override type Rec <: Base#Rec with C
abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}
trait Enricher2 extends Enricher1 {
override type Rec <: Enricher1#Rec with B
abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}
trait Concrete extends Base
trait Custom extends Concrete with Enricher2

关于scala - 如何覆盖类型成员向其添加更多混入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20254040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com