gpt4 book ai didi

Scala 将特征作为要混合的参数传入

转载 作者:行者123 更新时间:2023-12-01 23:47:26 25 4
gpt4 key购买 nike

我有(因为没有更好的术语)一个封装构造对象的工厂方法:

def createMyObject = new SomeClass(a, b, c, d)

现在,根据上下文,我需要将一个或多个特征混合到 SomeClass 中:
new SomeClass with Mixin1

或者
new SomeClass with Mixin2 with Mixin3

与其为每种“类型”的实例化创建多个单独的工厂方法,不如我如何传入要混合的特征,以便可以使用单个方法完成?或者也许有一个结构不同的好模式?

我想保持封装,所以我不想让每个消费者自己创建类。

最佳答案

如果您只需要没有方法覆盖的混合,您可以只使用类型类:

trait Marker
class C[+T <: Marker] { def b = 1 }

trait Marker1 extends Marker
implicit class I1[T <: Marker1](c: C[T]) {def a = 6 + c.b}

trait Marker2 extends Marker
implicit class I2[T <: Marker2](c: C[T]) {def a = 5 + c.b}

trait Marker3 extends Marker
implicit class I3[T <: Marker3](c: C[T]) {def k = 100}

trait Marker4 extends Marker3
implicit class I4[T <: Marker4](c: C[T]) {def z = c.k + 100} //marker3's `k` is visible here

scala> def create[T <: Marker] = new C[T]
create: [T <: Marker]=> C[T]


scala> val o = create[Marker1 with Marker3]
o: C[Marker1 with Marker3] = C@51607207

scala> o.a
res56: Int = 7

scala> o.k
res57: Int = 100

scala> create[Marker4].z
res85: Int = 200

但它不适用于 create[Marker1 with Marker2].a (含糊不清),所以这里没有线性化。但是,如果您只想混合一些方法(例如在 javascript 的原型(prototype)中)并可能注入(inject)一些东西 - 似乎很好。您还可以通过向 C、I1、I2 等添加一些特征来将其与传统的线性化混音结合起来。

关于Scala 将特征作为要混合的参数传入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28333441/

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