我想创建一个特征,但我希望所有使用此特征的类都有一些特定的类:
trait SomeHelper {
def homeUrl(): String =
s"$website.url"
}
class Foo(website: Website) extends SomeHelper {
val hello = homeUrl + "/hello"
}
如何要求特质用户拥有网站课程?
答案 0 :(得分:6)
希望我了解你的要求:
trait SomeHelper { self: Website =>
def homeUrl(): String = s"$url"
}
SomeHelper
的每个实施者现在都必须extend Website
或混合Website
。
如果您不想要扩展,则特征旨在包含未实现的成员以及您可以简单实施的成员:
trait SomeHelper {
def website: Website
def homeUrl(): String = s"$website.url"
}
另一方面,根据惯例,没有副作用的方法(例如homeUrl()
)不应该()
。
<强>更新强>
如果您有多个特征,您只需添加更多限制:
trait Website {
def url: String
}
trait Portal {
// whatever you want here, I'm making stuff up
def identity: String
}
trait SomeHelper { self: Website with Portal =>
// when you mixin with a self type bound, you can call methods directly
def homeUrl: String = s"$url:$identity"
}