如何确保使用trait的类中包含某些类?

时间:2017-04-11 19:24:08

标签: scala traits

我想创建一个特征,但我希望所有使用此特征的类都有一些特定的类:

trait SomeHelper {
  def homeUrl(): String =
    s"$website.url"
}

class Foo(website: Website) extends SomeHelper {
  val hello = homeUrl + "/hello"
}

如何要求特质用户拥有网站课程?

1 个答案:

答案 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"
}