@@ -11,8 +11,9 @@ next-page: tuples
1111previous-page : classes
1212---
1313
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 เช่นเดียวกับที่คลาสมี
1617
1718## การกำหนด trait
1819
@@ -117,11 +118,32 @@ iterator.next() // returns 1
117118
118119{% endtabs %}
119120
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
121123
122124## Subtyping
123125
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` อีกทีหนึ่ง
125147
126148{% tabs trait - pet- example class = tabs- scala- version % }
127149
@@ -172,5 +194,5 @@ animals.foreach(pet => println(pet.name)) // แสดงค่า Harry Sally
172194
173195{% endtabs % }
174196
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