วันอังคารที่ 23 พฤศจิกายน พ.ศ. 2553

Constructor และ Method

Product book = new Product();

เพื่อนๆทราบแล้วว่าคำสั่ง new Product(); จะสั่งให้สร้างออบเจกต์ในหน่วยความจำ เราเรียก Product() ที่ตามหลังคำสั่ง new นี้ว่าคอนสตรักเตอร์ครับ (constructor)

Constructor
คือเมธอดพิเศษ ทำหน้าที่กำหนดการทำงานต่างๆให้กับออบเจกต์ใหม่ที่เกิดขึ้นจากคำสั่ง new ทันทีโดยอัตโนมัติ หากไม่กำหนดคอนสตรักเตอร์ ตัวแปลภาษา C# จะสร้างคอนสตรักเตอร์พื้นฐาน (default constructor) ให้เอง

ตัวอย่างต่อไปนี้คือ คอนสตรักเตอร์พื้นฐาน ของคลาส Product
     public Product()
     {
     }

ตัวอย่างการเรียกใช้ default constructor จากแบบฝึกหัดที่ผ่านมา

รูปแบบการนิยามคอนสตรักเตอร์
[ access_modifiers ] identifier ( [ parameter_list ] )
{
     [ code_body ]
}
access_modifiers ได้อธิบายแล้ว ณ บทความก่อนหน้านี้
identifier หมายถึง ชื่อคอนสตรักเตอร์ ต้องเป็นชื่อเดียวกับคลาสเท่านั้น
parameter_list หมายถึง พารามิเตอร์จำนวนหนึ่ง เช่น char[ ] id, char[ ] name, float price เป็นต้น
code_body หมายถึง คำสั่งต่างๆภายในคอนสตรักเตอร์

ตัวอย่างการประกาศคอนสตรักเตอร์ในคลาส Product

รูปข้างต้นออกแบบให้รายการพารามิเตอร์ (parameter_list) มีจำนวนสามตัวเท่ากับจำนวนฟิวด์ (เพื่อนๆจะออกแบบรายการพารามิเตอร์อย่างไรก็ได้ โดยคำนึงถึงการนำเอาไปใช้มากที่สุด) และสำหรับ code_body นี้ประกอบด้วยสามคำสั่ง ได้แก่
this.id = id; หมายถึง นำค่าพารามิเตอร์ id ที่รับมาส่งให้ฟิวด์ทางซ้ายของเครื่องหมายเท่ากับ แต่เนื่องจากชื่อฟิวด์และชื่อพารามิเตอร์ id เหมือนกัน จึงต้องแยกแยะด้วยคำสั่ง this
name = newName; หมายถึง นำค่าพารามิเตอร์ newName ที่รับมาส่งให้ฟิวด์ชื่อ name แต่เนื่องจากชื่อฟิวด์และชื่อพารามิเตอร์ต่างกัน จะใช้หรือไม่ใช้คำสั่ง this ก็ได้
Price = price; หมายถึง นำค่าพารามิเตอร์ price ที่รับมาส่งให้พรอเพอร์ตี้ชื่อ Price ซึ่งเป็นรูปแบบที่ควรกระทำมากที่สุด

เมื่อสร้างคอนสตรักเตอร์แล้ว เป็นผลให้ default constructor ที่มีอยู่ต้องถูกยกเลิกไป

เมธอด
มีหน้าที่อธิบายพฤติกรรมของคลาส หรือกระทำกระบวนการบางอย่าง จากรูปข้างต้นเมธอดชื่อ ToCharArray ทำหน้าที่เปลี่ยน String ให้เป็น char[ ] แสดงว่าเมธอดนี้เป็นพฤติกรรมหนึ่งของคลาส String

รูปแบบการนิยามเมธอด
[ access_modifiers ] return_type identifier ( [ parameter_list ] )
{
     [ code_body ]
}
access_modifiers ได้อธิบายแล้ว ณ บทความก่อนหน้านี้
return_type หมายถึง ไทป์ที่จะถูกส่งออกจากเมธอด (ด้วยคำสั่ง return ที่อยู่ภายในเมธอด หากไทป์นั้นไม่ใช่ void) ไปยังโค้ดที่เรียกใช้
identifier หมายถึง ชื่อเมธอด
parameter_list หมายถึง พารามิเตอร์จำนวนหนึ่ง เช่น char[ ] id, char[ ] name, float price เป็นต้น
code_body หมายถึง คำสั่งต่างๆภายในเมธอด

อาร์กิวเมนต์ VS พารามิเตอร์
การส่งค่าใดๆให้กับเมธอดที่ถูกเรียก ผมเรียกว่า อาร์กิวเมนต์ (argument) ส่วนตัวแปรใดๆที่นิยามจาก parameter_list ที่รับค่าอาร์กิวเมนต์ ผมเรียกว่า พารามิเตอร์ (parameter)

พารามิเตอร์และ modifier
เมื่อเรานิยามเมธอดจะต้องกำหนดเครื่องหมาย ( และ ) ต่อท้ายชื่อเมธอดเสมอ โดยจะมีพารามิเตอร์หรือไม่ก็ได้ นอกจากนี้ยังสามารถระบุ modifier ให้แก่พารามิเตอร์แต่ละตัวด้วย สำหรับ modifier แบ่งออกเป็น 4 ประเภท ได้แก่
- value parameter หรือพารามิเตอร์ขาเข้า กล่าวคือ เมื่อเกิดการแก้ไขค่าของตัวแปรใดๆที่เป็นพารามิเตอร์ ค่าที่เปลี่ยนแปลงนั้นจะไม่ส่งผลกระทบต่อค่าเดิมที่ส่งมา เปรียบได้กับเอกสารที่ถ่ายสำเนาแล้ว แผ่นสำเนาจะนำไปขีดเขียนอย่างไร ก็ไม่กระทบต่อต้นฉบับเดิมของมัน พารามิเตอร์ประเภทนี้พบเห็นทั่วไป โดยไม่ต้องกำหนด modifier
- ref parameter หรือพารามิเตอร์ขาออก กล่าวคือ เมื่อเกิดการแก้ไขค่าของตัวแปรใดๆที่เป็นพารามิเตอร์ ค่าที่เปลี่ยนแปลงนั้นจะส่งผลกระทบต่อค่าเดิมที่ส่งมา เปรียบได้กับเอกสารต้นฉบับซึ่งเป็นของเรา แล้วถูกเพื่อนเราเอาไปขีดเขียน ภายหลังส่งกลับให้เรา อย่างไรมันก็ถูกขีดเขียน พารามิเตอร์ประเภทนี้จะต้องกำหนดคำสั่ง ref ไว้สองตำแหน่ง
     1. โค้ดที่ระบุอาร์กิวเมนต์จากการเรียกเมธอด เช่น Input(ref myName);
     2. โค้ดที่นิยามเมธอด เช่น public void Input(ref name) { ... }
     ***หมายเหตุ อาร์กิวเมนต์ชื่อ name นี้จะต้องถูกำหนดค่าเริ่มต้นก่อนส่งเสมอ
- out parameter หรือพารามิเตอร์ขาออก เช่นเดียวกับ ref parameter ต่างที่ไม่จำเป็นต้องกำหนดค่าเริ่มต้นให้กับอาร์กิวเมนต์ก่อนก็ได้ จากตัวอย่างคือ ไม่จำเป็นต้องกำหนดค่าเริ่มต้นให้กับ name
- params parameter หรือพารามิเตอร์อาร์เรย์ สำหรับการส่งแบบอาร์เรย์ พารามิเตอร์ประเภทนี้ระบุคำสั่ง params ไว้เพียงโค้ดที่นิยามเมธอดเท่านั้น ส่วนโค้ดเรียกเมธอดไม่ต้องระบุ
     โด้ดนิยามเมธอด เช่น public void Show(params int[ ] nameList) { ... }

***หมายเหตุ หากกำหนด params parameter ไว้กับพารามิเตอร์ประเภทอื่น จะต้องเขียน params parameter ไว้ลำดับสุดท้ายเท่านั้น

คอนสตรักเตอร์ VS เมธอด VS พรอเพอร์ตี้
เพื่อนๆที่เริ่มเขียนภาษา C# อย่าได้สบสนระหว่าง คอนสตรักเตอร์ กับ เมธอด หรือ เมธอด กับ พรอเพอร์ตี้ เพราะมันมีจุดสังเกตที่แต่งต่างกัน ดังนี้
- คอนสตรักเตอร์ไม่มี return _type เหมือนเมธอด (ดังที่กล่าวในหัวข้อ "รูปแบบการนิยามเมธอด")
- คอนสตรักเตอร์จะทำงานเพียงครั้งเดียว คือเมื่อมีการสร้างออบเจกต์ใหม่จากคำสั่ง new เท่านั้น
- เมธอดเรียกให้ทำงานได้หลายครั้งเช่นเดียวกับพรอเพอร์ตี้
- เมธอดจะมีเครื่องหมาย ( และ ) ตามหลังชื่อเสมอ ส่วนพรอเพอร์ตี้นั้นไม่มี
- เมธอดสามารถนิยามผลลัพธ์เหมือนพรอเพอร์ตี้ได้ แต่จะมุ่งไปที่กระบวนการภายใน มากกว่าการ ขอค่า หรือ กำหนดค่า แก่ฟิวด์เฉกเช่นพรอเพอร์ตี้
- พรอเพอร์ตี้ประเภท กำหนดค่า จะมีเครื่องหมาย = ตามท้ายชื่อ ส่วนเมธอดการ กำหนดค่า จะต้องผ่านทางอาร์กิวเมนต์เท่านั้น

แบบฝึกหัด
- ไม่มีครับ เรื่องนี้จะถูกประยุกต์ในตัวอย่างถัดไป

1 ความคิดเห็น:

  1. Excellent site. Plenty of helpful info here. I'm sending it to some pals ans also sharing in delicious. And of course, thanks for your effort!

    my web blog; new cellulite treatment

    ตอบลบ