gpt4 book ai didi

scala - 防止在没有封闭对象的情况下从特征创建匿名类

转载 作者:行者123 更新时间:2023-12-01 14:11:07 26 4
gpt4 key购买 nike

假设我有以下特征和对象:

trait NoAnon {
val i: Int
}

object NoAnon {
def create = new NoAnon {
val i = 123
}
}

我想防止在伴随对象之外创建 NoAnon 的匿名实例。 IE。在这个例子中只有 create 应该被允许这样做。我可以将它们包含在另一个对象中,并将特性设为该对象的私有(private)以完成此操作:

object Ctx {

private[Ctx] trait NoAnon {
val i: Int
}

object NoAnon {
def create = new Ctx.NoAnon {
val i = 123
}
}

}

是否可以在没有封闭对象 Ctx 的情况下执行此操作?

更清楚一点,特征可以模仿私有(private)抽象类构造函数的功能吗?也就是下面的例子,除了有一个特征。

abstract class NoAnon private[NoAnon] {
val i: Int
}

object NoAnon {
def create = new NoAnon {
val i = 123
}
}

最佳答案

也许你可以使用一个带有私有(private)构造函数的类,并用你的特征扩展它。您甚至可以将该类嵌套在伴随对象中:

trait NoAnon extends NoAnon.type#NoAnonCheck { 
val i: Int
}

object NoAnon {
class NoAnonCheck private[NoAnon]
def create = new NoAnon {
val i = 1
}
}

那么如果你尝试过:

new NoAnon { val i = 2 }

你得到:

error: constructor NoAnonCheck in class NoAnonCheck cannot be accessed in <$anon: NoAnonCheck with NoAnon>

但您可以使用 NoAnon.create。除了添加类似这样的东西,我认为目前在 Scala 中没有一种纯粹的方法可以做到这一点。

当然,正如您所知并在评论中提到的,其他选项是使特征在封闭对象或包的范围内私有(private)。

关于scala - 防止在没有封闭对象的情况下从特征创建匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29774891/

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