File tree Expand file tree Collapse file tree 1 file changed +25
-1
lines changed Expand file tree Collapse file tree 1 file changed +25
-1
lines changed Original file line number Diff line number Diff line change 1
1
---
2
2
layout : tour
3
- title : Self-types
3
+ title : 自类型
4
4
5
5
discourse : false
6
6
@@ -13,3 +13,27 @@ language: zh-cn
13
13
next-page : implicit-parameters
14
14
previous-page : compound-types
15
15
---
16
+ 自类型用于声明一个特质必须混入其他特质,尽管该特质没有直接扩展其他特质。 这使得所依赖的成员可以在没有导入的情况下使用。
17
+
18
+ 自类型是一种细化 ` this ` 或 ` this ` 别名之类型的方法。 语法看起来像普通函数语法,但是意义完全不一样。
19
+
20
+ 要在特质中使用自类型,写一个标识符,跟上要混入的另一个特质,以及 ` => ` (例如 ` someIdentifier: SomeOtherTrait => ` )。
21
+ ``` tut
22
+ trait User {
23
+ def username: String
24
+ }
25
+
26
+ trait Tweeter {
27
+ this: User => // 重新赋予 this 的类型
28
+ def tweet(tweetText: String) = println(s"$username: $tweetText")
29
+ }
30
+
31
+ class VerifiedTweeter(val username_ : String) extends Tweeter with User { // 我们混入特质 User 因为 Tweeter 需要
32
+ def username = s"real $username_"
33
+ }
34
+
35
+ val realBeyoncé = new VerifiedTweeter("Beyoncé")
36
+ realBeyoncé.tweet("Just spilled my glass of lemonade") // 打印出 "real Beyoncé: Just spilled my glass of lemonade"
37
+ ```
38
+
39
+ 因为我们在特质 ` trait Tweeter ` 中定义了 ` this: User => ` ,现在变量 ` username ` 可以在 ` tweet ` 方法内使用。 这也意味着,由于 ` VerifiedTweeter ` 继承了 ` Tweeter ` ,它还必须混入 ` User ` (使用 ` with User ` )。
You can’t perform that action at this time.
0 commit comments