@@ -11,8 +11,9 @@ next-page: tuples
11
11
previous-page : classes
12
12
---
13
13
14
- Trait ใช้เพื่อแชร์ interface และ field ระหว่างคลาส มันจะคล้ายกับ interface ใน Java 8
15
- คลาส และ object สามารถ extend trait ได้ แต่ trait ไม่สามารถสร้างเป็น object ได้ ดังนั้น trait จึงไม่สามารถมี parameter เช่นเดียวกับคลาส
14
+ Trait ใช้เพื่อแชร์ interface และ field ระหว่างคลาส โดยที่ trait จะคล้ายกับ interface ใน Java 8\
15
+ คลาส และ object สามารถ extend trait ได้ แต่เราไม่สามารถสร้าง object จาก trait ได้\
16
+ ดังนั้น trait จึงไม่สามารถมี parameter เช่นเดียวกับที่คลาสมี
16
17
17
18
## การกำหนด trait
18
19
@@ -117,11 +118,32 @@ iterator.next() // returns 1
117
118
118
119
{% endtabs %}
119
120
120
- คลาส ` IntIterator ` นี้รับค่า parameter ` to ` เพื่อกำหนดค่าสูงสุด (upper bound) โดยที่คลาส ` IntIterator ` ได้ extend จาก ` Iterator[Int] ` ดังนั้น method ` next ` จะต้อง return ค่าเป็น Int
121
+ คลาส ` IntIterator ` นี้รับค่า parameter ` to ` เพื่อกำหนดค่าสูงสุด (upper bound) โดยที่คลาส ` IntIterator ` ได้ extend จาก ` Iterator[Int] ` \
122
+ ดังนั้น method ` next ` จะต้อง return ค่าเป็น Int
121
123
122
124
## Subtyping
123
125
124
- ในเมื่อ trait ที่ให้มานั้น required, subtype ของ trait สามารถถูกใช้แทนที่ได้
126
+ เมื่อจำเป็นต้องใช้ trait นั้นๆ เราสามารถใช้ subtype (คลาสใดๆ ที่ extend มาจาก trait) แทนได้
127
+
128
+ > ** Note by Thai translator:** \
129
+ > "เมื่อจำเป็นต้องใช้ trait นั้นๆ" ในที่นี้ น่าจะหมายถึงเรามีการระบุไว้ว่า parameter ที่ได้ระบุ type เป็น trait\
130
+ > ดังนั้นเราสามารถใช้ * subtype ใดๆ ที่ implement จาก trait นั้นๆ ได้*
131
+ >
132
+ > ลองพิจารณา code นี้
133
+ >
134
+ > ``` scala
135
+ > val dog = new Dog (" Harry" ) // คลาส `Dog` เป็น subtype ของ trait `Pet`
136
+ >
137
+ > def getPetName (pet : Pet ): String {
138
+ > return pet.name
139
+ > }
140
+ >
141
+ > getPetName(dog)
142
+ > ```
143
+ >
144
+ > ถ้าอิงจากตัวอย่างจาก code block ด้านล่าง เราจะเห็นได้ว่า code ด้านบน\
145
+ > เราส่งตัวแปร `dog` ซึ่งเป็น instance ของคลาส `Dog`\
146
+ > โดยที่คลาส `Dog` ก็เป็น subtype ของ trait `Pet` อีกทีหนึ่ง
125
147
126
148
{% tabs trait - pet- example class = tabs- scala- version % }
127
149
@@ -172,5 +194,5 @@ animals.foreach(pet => println(pet.name)) // แสดงค่า Harry Sally
172
194
173
195
{% endtabs % }
174
196
175
- ` trait Pet ` มี abstract field ` name ` ซึ่ง implement ด้วย Cat และ Dog ใน constructor ของมัน
176
- ในบรรทัดสุดท้าย เราเรียกใช้ ` pet.name ` ซึ่งใน subtype ใดๆ ของ trait ` Pet ` (ในที่นี้คือ ` Cat ` , และ ` Dog ` ) ได้ implement field ` name ` ไว้แล้ว
197
+ `trait Pet` มี abstract field `name` ซึ่ง implement ไว้ใน constructor ของคลาส ` Cat` และ ` Dog` \
198
+ ในบรรทัดสุดท้าย เราเรียกใช้ `pet.name` ซึ่งได้มีการ implement `name` ไว้ใน subtype ใดๆ ของ trait `Pet` แล้ว
0 commit comments