def x = y } abstract clas-6ren">
gpt4 book ai didi

scala - 什么时候使用自引用或组合?

转载 作者:行者123 更新时间:2023-12-04 15:53:22 24 4
gpt4 key购买 nike

看看下面的代码片段:

trait T { def y = println("hello") }
class A {
self: T =>
def x = y
}
abstract class B {
val self: T
def x = self.y
}

val a = new A with T
val b = new B with T {
val self = this
}
a.x
b.x

A 类和 B 类有对特征 T 的引用,A 有一个自引用,B正在使用组合。

我在这里只看到两个区别:第一个是创建新对象第二个是访问 T。

在 B 中有更多的语法糖,我不需要显式访问引用 self,我不需要绑定(bind)变量。

还有其他区别吗?在某些情况下应该首选而不是其他?

最佳答案

您的问题似乎排除了普通继承。对于A,self类型相比class A extends T没有优势。对于 B,如果您打算只按照编写的方式创建它,即使用 self = this,extends 也一样好(而且简单得多)

我不认为 self 类型有那么多用例(但这不是关于组合与继承的讨论)

其中之一是强制特征仅实例化为另一种未知类型的子类型,因为它显示为类型参数或抽象类型成员。例如,trait X[A] {self: A => ...} 你可以看看 this realistic example在 Scala 网站上,有一个类型成员。

另一个是当您正在组合模块而不是实例时,特别是当模块具有类型成员时,使组合仅在编译时可行。这或多或少与 CakePattern 有关。

组合(无论是抽象值还是构造函数参数)当然具有强大的优势,您可以传递 T 的外部实例,在 B 的不同实例之间共享它,更动态地选择它。实例可以传递给函数并从函数返回,mixin 不能

关于scala - 什么时候使用自引用或组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7177334/

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