Skip to content

Commit 1a3b24f

Browse files
committed
update /th/tour/traits page - translate more to make it clearer
1 parent 44d348c commit 1a3b24f

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed

_th/tour/traits.md

+28-6
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ next-page: tuples
1111
previous-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

Comments
 (0)