ผลต่างระหว่างรุ่นของ "คลาส (คอมพิวเตอร์)"
ลไม่มีความย่อการแก้ไข |
ไม่มีความย่อการแก้ไข |
||
บรรทัด 1: | บรรทัด 1: | ||
ในการเขียน[[โปรแกรมเชิงวัตถุ]] '''คลาส''' (class) คือต้นแบบที่กำหนดคุณสมบัติและพฤติกรรมการทำงานของ |
ในการเขียน[[โปรแกรมเชิงวัตถุ]] '''คลาส''' (class) คือต้นแบบที่กำหนดคุณสมบัติและพฤติกรรมการทำงานของ[[ออปเจ็ค]]ทึ่ถูกสร้างมาจากคลาสนั้นๆ |
||
องค์ประกอบของคลาสมีสองส่วนหลักได้แก่ |
องค์ประกอบของคลาสมีสองส่วนหลักได้แก่ |
||
# ข้อมูล (data) หรือ คุณสมบัติ (property) สำหรับเก็บข้อมูลในการทำงานหรือบอกสถานะปัจจุบันของออปเจ็ค ตัวอย่างเช่น คลาสชนิดบัญชีธนาคารสามารถมีข้อมูลคือ เลขที่บัญชี, ชื่อเจ้าของบัญชี, และยอดเงินปัจจุบัน |
|||
# ข้อมูล (data) หรือ คุณสมบัติ (property) |
|||
# พฤติกรรมการทำงาน (method หรือ function) เป็นส่วนรับคำสั่งและทำงานตามคำสั่งนั้น เช่นคลาสบัญชีธนาคารจากตัวอย่างข้างบนอาจจะมีฟังชั่นสำหรับฝากและถอนเงินจากบัญชี เป็นต้น |
|||
# พฤติกรรมการทำงาน (method) |
|||
นอกจากนี้ คลาสยังสามารถมีฟังชั่นพิเศษเรียกว่า constructor ซึ่งจะถูกเรียกใช้ในเวลาที่กำลังสร้างออปเจ็คจากคลาสเพื่อตั้งค่าเริ่นต้นให้กับข้อมูลและคุณสมบัติของออปเจ็คนั้น |
|||
== การจำกัดการเข้าถึง == |
|||
เราสามารถจำกัดความสามารถในการเห็นและใช้งานของแต่ละสมาชิกของคลาสหรือแม้แต่ตัวคลาสเองจากโลกภายนอกได้ ผลที่ได้คือข้อมูลและการทำงานส่วนตัวของคลาสจะถูกซ่อนไว้ โลกภายนอกสามารถขอให้ออปเจ็คทำงานผ่านฟังชั่นสาธารณะเท่านั้นโดยที่ไม่มีความจำเป็นจะต้องรู้รายละเอียดการทำงานภายในของคลาสนั้น ซึ่งก็เข้าหลักการที่เรียกว่า [[Encapsulation]] นั่นเอง |
|||
สมาชิกส่วนตัว (private members) มีเพียงออปเจ็คของคลาสนั้นเท่านั้นที่สามารถเห็นและใช้งานสมาชิกเหล่านี้ได้ โลกภายนอกจะไม่มีทางรู้เลยว่าคลาสมีสมาชิกเหล่านี้อยู่ |
|||
สมาชิกสาธารณะ (public members) โลกภายนอกสามารถเรียกใช้สมาชิกเหล่านี้ได้โดยไม่มีข้อจำกัด |
|||
สมาชิกคุ้มครอง (protected members) อยู่ระัหว่างแบบส่วนตัวกับสาธารณะ สามารถเรียกใช้ได้โดยคลาสนั้นเองและคลาสย่อยที่สร้างมาจากคลาสนั้น เท่านั้น |
|||
== ความสัมพันธ์ระหว่างคลาส == |
|||
* คลาสมีคลาสอื่นเป็นส่วนประกอบ (has-a) เช่นคลาสบัญชีรถยนต์มีคลาสเครื่องยนต์เป็นส่วนประกอบอยู่ภายใน |
|||
* คลาสหลักกับคลาสย่อย (is-a) เช่นคลาสรถยนต์เป็นคลาสหลักสามารถวิ่งได้ มีรถแข่งและรถบรรทุกเป็นคลาสย่อย ทั้งรถแข่งและรถบรรทุกเป็นรถยนต์ชนิดหนึ่งจึงสามารถวิ่งได้เช่นกัน เข้าหลักการ [[Inheritance]] แต่รถแข่งสามารถวิ่งได้เร็ว รถบรรทุกสามารถขนของได้มาก เป็นคุณสมบัติเพิ่มเติม |
|||
ความสัมพันธ์แบบคลาสหลักกับคลาสย่อยนี้ทำให้เกิดหลักสำคัญอีกอย่างคือ [[Polymorphism]] คือทั้งรถแข่งและรถบรรทุกสามารถเลี้ยวได้โดยการบังคับพวงมาลัย แต่รถทั้งสองชนิดจะมีการตอบสนองที่ต่างกัน คือรถแข่งจะเลี้ยวได้ไวกว่าในขณะที่รถบรรทุกเลี้ยวอย่างรวดเร็วไม่ได้เพราะจะทำให้พลิกคว่ำ |
|||
== คลาสแบบพิเศษ == |
|||
คลาสแบบ Abstract คือคลาสหลักที่จะต้องถูกซับคลาส ไม่สามารถสร้างออบเจ็คโดยตรงจากคลาสนี้ได้ มีจุดมุ่งหมายเพื่อประกาศสมาชิกร่วมบางส่วนของคลาสย่อยแต่ยังไม่นิยามรายละเอียดการทำงาน ปล่อยให้เป็นหน้าที่ของคลาสย่อยที่จะนิยามวิธีการทำงานแตกต่างกันไปตามความมุ่งหมายพิเศษของแต่ละคลาสย่อย |
|||
Interface คือข้อตกลงว่าคลาสที่มีอินเตอร์เฟสชนิดนั้นๆ สามารถทำงานตามข้อตกลงที่นิยามไว้ในอินเตอร์เฟสได้ |
|||
== ลักษณะของคลาสที่ดี == |
|||
* ซ่อนข้อมูลและคุณสมบัติส่วนตัวของคลาสโดยตั้งค่าให้เป็น private โลกภายนอกสามารถเข้าถึงข้อมูลเหล่านี้ผ่านทางฟังชั่นพิเศษที่จะมีการตรวจสอบความถูกต้องของข้อมูล |
|||
* ตั้งค่าเริ่มต้นของข้อมูลและคุณสมบัติของคลาสเสมอ ออบเจ็คจะอยู่ในสถานะที่พร้อมถูกใช้งานทันที |
|||
* แตกคลาสที่มีภาระมาก (responsibilities) ออกเป็นส่วนย่อยๆ และแบ่งความรับผิดชอบที่เฉพาะเจาะจงให้กับคลาสเล็กๆ เหล่านั้น คลาสที่ใหญ่เกินไปและทำงานหลายอย่างจะยากต่อการบำรุงรักษาและแก้ไข |
|||
* ตั้งชื่อสมาชิกให้สัมพันธ์กับหน้าที่ของมันเพื่อบ่งบอกจุดมุ่งหมายที่แน่ชัด จะทำให้ง่ายต่อการแก้ไขโปรแกรมต่อไป |
|||
== ตัวอย่าง == |
== ตัวอย่าง == |
รุ่นแก้ไขเมื่อ 00:08, 15 มกราคม 2550
ในการเขียนโปรแกรมเชิงวัตถุ คลาส (class) คือต้นแบบที่กำหนดคุณสมบัติและพฤติกรรมการทำงานของออปเจ็คทึ่ถูกสร้างมาจากคลาสนั้นๆ
องค์ประกอบของคลาสมีสองส่วนหลักได้แก่
- ข้อมูล (data) หรือ คุณสมบัติ (property) สำหรับเก็บข้อมูลในการทำงานหรือบอกสถานะปัจจุบันของออปเจ็ค ตัวอย่างเช่น คลาสชนิดบัญชีธนาคารสามารถมีข้อมูลคือ เลขที่บัญชี, ชื่อเจ้าของบัญชี, และยอดเงินปัจจุบัน
- พฤติกรรมการทำงาน (method หรือ function) เป็นส่วนรับคำสั่งและทำงานตามคำสั่งนั้น เช่นคลาสบัญชีธนาคารจากตัวอย่างข้างบนอาจจะมีฟังชั่นสำหรับฝากและถอนเงินจากบัญชี เป็นต้น
นอกจากนี้ คลาสยังสามารถมีฟังชั่นพิเศษเรียกว่า constructor ซึ่งจะถูกเรียกใช้ในเวลาที่กำลังสร้างออปเจ็คจากคลาสเพื่อตั้งค่าเริ่นต้นให้กับข้อมูลและคุณสมบัติของออปเจ็คนั้น
การจำกัดการเข้าถึง
เราสามารถจำกัดความสามารถในการเห็นและใช้งานของแต่ละสมาชิกของคลาสหรือแม้แต่ตัวคลาสเองจากโลกภายนอกได้ ผลที่ได้คือข้อมูลและการทำงานส่วนตัวของคลาสจะถูกซ่อนไว้ โลกภายนอกสามารถขอให้ออปเจ็คทำงานผ่านฟังชั่นสาธารณะเท่านั้นโดยที่ไม่มีความจำเป็นจะต้องรู้รายละเอียดการทำงานภายในของคลาสนั้น ซึ่งก็เข้าหลักการที่เรียกว่า Encapsulation นั่นเอง
สมาชิกส่วนตัว (private members) มีเพียงออปเจ็คของคลาสนั้นเท่านั้นที่สามารถเห็นและใช้งานสมาชิกเหล่านี้ได้ โลกภายนอกจะไม่มีทางรู้เลยว่าคลาสมีสมาชิกเหล่านี้อยู่
สมาชิกสาธารณะ (public members) โลกภายนอกสามารถเรียกใช้สมาชิกเหล่านี้ได้โดยไม่มีข้อจำกัด
สมาชิกคุ้มครอง (protected members) อยู่ระัหว่างแบบส่วนตัวกับสาธารณะ สามารถเรียกใช้ได้โดยคลาสนั้นเองและคลาสย่อยที่สร้างมาจากคลาสนั้น เท่านั้น
ความสัมพันธ์ระหว่างคลาส
- คลาสมีคลาสอื่นเป็นส่วนประกอบ (has-a) เช่นคลาสบัญชีรถยนต์มีคลาสเครื่องยนต์เป็นส่วนประกอบอยู่ภายใน
- คลาสหลักกับคลาสย่อย (is-a) เช่นคลาสรถยนต์เป็นคลาสหลักสามารถวิ่งได้ มีรถแข่งและรถบรรทุกเป็นคลาสย่อย ทั้งรถแข่งและรถบรรทุกเป็นรถยนต์ชนิดหนึ่งจึงสามารถวิ่งได้เช่นกัน เข้าหลักการ Inheritance แต่รถแข่งสามารถวิ่งได้เร็ว รถบรรทุกสามารถขนของได้มาก เป็นคุณสมบัติเพิ่มเติม
ความสัมพันธ์แบบคลาสหลักกับคลาสย่อยนี้ทำให้เกิดหลักสำคัญอีกอย่างคือ Polymorphism คือทั้งรถแข่งและรถบรรทุกสามารถเลี้ยวได้โดยการบังคับพวงมาลัย แต่รถทั้งสองชนิดจะมีการตอบสนองที่ต่างกัน คือรถแข่งจะเลี้ยวได้ไวกว่าในขณะที่รถบรรทุกเลี้ยวอย่างรวดเร็วไม่ได้เพราะจะทำให้พลิกคว่ำ
คลาสแบบพิเศษ
คลาสแบบ Abstract คือคลาสหลักที่จะต้องถูกซับคลาส ไม่สามารถสร้างออบเจ็คโดยตรงจากคลาสนี้ได้ มีจุดมุ่งหมายเพื่อประกาศสมาชิกร่วมบางส่วนของคลาสย่อยแต่ยังไม่นิยามรายละเอียดการทำงาน ปล่อยให้เป็นหน้าที่ของคลาสย่อยที่จะนิยามวิธีการทำงานแตกต่างกันไปตามความมุ่งหมายพิเศษของแต่ละคลาสย่อย
Interface คือข้อตกลงว่าคลาสที่มีอินเตอร์เฟสชนิดนั้นๆ สามารถทำงานตามข้อตกลงที่นิยามไว้ในอินเตอร์เฟสได้
ลักษณะของคลาสที่ดี
- ซ่อนข้อมูลและคุณสมบัติส่วนตัวของคลาสโดยตั้งค่าให้เป็น private โลกภายนอกสามารถเข้าถึงข้อมูลเหล่านี้ผ่านทางฟังชั่นพิเศษที่จะมีการตรวจสอบความถูกต้องของข้อมูล
- ตั้งค่าเริ่มต้นของข้อมูลและคุณสมบัติของคลาสเสมอ ออบเจ็คจะอยู่ในสถานะที่พร้อมถูกใช้งานทันที
- แตกคลาสที่มีภาระมาก (responsibilities) ออกเป็นส่วนย่อยๆ และแบ่งความรับผิดชอบที่เฉพาะเจาะจงให้กับคลาสเล็กๆ เหล่านั้น คลาสที่ใหญ่เกินไปและทำงานหลายอย่างจะยากต่อการบำรุงรักษาและแก้ไข
- ตั้งชื่อสมาชิกให้สัมพันธ์กับหน้าที่ของมันเพื่อบ่งบอกจุดมุ่งหมายที่แน่ชัด จะทำให้ง่ายต่อการแก้ไขโปรแกรมต่อไป
ตัวอย่าง
ภาษาซีชาร์ป
public class Example { static void Main() { System.Console.WriteLine("Hello, world!"); } }
ภาษาจาวา
public class Example { private int data; public int getData() { return data; } public void setData(int d) { data = d; } }