@@ -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