- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
特征的 self 类型A
:
trait B
trait A { this: B => }
说“A
不能混合到不扩展B
的具体类中”。
另一方面,以下内容:
trait B
trait A extends B
说“在A
中混合的任何(具体或抽象)类也将在B中混合”。
这两个说法不是同一个意思吗? self 类型似乎只是为了产生简单的编译时错误的可能性。
我错过了什么?
最佳答案
主要用于 Dependency Injection ,例如在蛋糕图案中。存在 great article涵盖了 Scala 中许多不同形式的依赖注入(inject),包括 Cake 模式。如果你用谷歌搜索“Cake Pattern and Scala”,你会得到很多链接,包括演示文稿和视频。现在,这里是 another question 的链接.
现在,至于 self 类型和扩展特质之间有什么区别,这很简单。如果您说B extends A
,那么B
是一个A
。当您使用自类型时,B
需要 A
。使用 self 类型创建有两个特定要求:
B
,那么您需要混入 A
。A
。考虑以下示例:
scala> trait User { def name: String }
defined trait User
scala> trait Tweeter {
| user: User =>
| def tweet(msg: String) = println(s"$name: $msg")
| }
defined trait Tweeter
scala> trait Wrong extends Tweeter {
| def noCanDo = name
| }
<console>:9: error: illegal inheritance;
self-type Wrong does not conform to Tweeter's selftype Tweeter with User
trait Wrong extends Tweeter {
^
<console>:10: error: not found: value name
def noCanDo = name
^
如果Tweeter
是User
的子类,则不会出现错误。在上面的代码中,每当使用 Tweeter
时,我们都需要一个 User
,但是没有提供 User
错误
,所以我们得到了一个错误。现在,上面的代码仍在范围内,请考虑:
scala> trait DummyUser extends User {
| override def name: String = "foo"
| }
defined trait DummyUser
scala> trait Right extends Tweeter with User {
| val canDo = name
| }
defined trait Right
scala> trait RightAgain extends Tweeter with DummyUser {
| val canDo = name
| }
defined trait RightAgain
使用Right
,可以满足混入User
的要求。然而,上面提到的第二个要求并没有得到满足:对于扩展Right
的类/特征来说,实现User
的负担仍然存在。
通过RightAgain
,这两个要求都得到满足。提供了User
和User
的实现。
有关更多实际用例,请参阅本答案开头的链接!但是,希望现在你明白了。
关于scala - self 类型和特质子类有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1990948/
我正在尝试在 proton::connection 对象的工作队列中添加 proton::work 函数(打开一个新的发送者)。我有一个指向工作队列的指针,但我的问题是如何正确绑定(bind) ope
引用资料: 身份方案 Format: id:::: http://docs.vespa.ai/documentation/content/buckets.html http://docs.vespa.
我正在使用 C++ 实现 Qpid 质子客户端。 Qpid 版本为 0.12.2。 我运行默认容器: proton::container(myHandler).run(); MyHandler 是这样
我在自己的服务器上部署了一个 Proton CEP 实例,它有 2 个 CPU 和 4GB RAM。 让它工作一整夜后,CPU 使用率大幅增加,每个核心都达到 100%。正在执行的命令是: java
我想从服务总线读取订阅消息。我正在为 python 使用 qpid-proton 库。我正在通过此链接接收消息 Proton-Python-Example-Simple-Receive .我正在传递此
我是一名优秀的程序员,十分优秀!