10. การเขียนโปรแกรมเชิงวัตถุ Object Oriented Programming(OOP)

10. การเขียนโปรแกรมเชิงวัตถุ

Object Oriented Programming(OOP)

            เมื่ออ่านเรื่องคลาสและอ็อปเจ็คแล้ว สิ่งที่จะพิจารณาต่อไปคือเรื่องของการเขียนโปรแกรมเชิงวัตถุซึ่งเป็นจุดเด่นของการเขียนโปรแกรมในภาษาจาวา ประกอบไปด้วย Encapsulation, Inheritance และPolymorphism

Encapsulation การห่อหุ้มข้อมูล

 คือการปกปิดข้อมูลหรือเมท็อดบางอย่างไม่ให้ภายนอกมองเห็นและเปลี่ยนแปลงได้(อ่านเพิ่มเติมจากเรื่อง อ็อปเจ็ค)

Inheritance การสืบทอดคุณสมบัติ

ช่วยในการประหยัดเวลาสำหรับการเขียนโปรแกรม คือสามารถที่จะสร้างคลาสใหม่โดยสืบทอดคุณสมบัติจากคลาสเก่าได้โดยไม่ต้องเขียนอะไรให้ยุ่งยากใหม่ทั้งหมด นอกจากนี้ยังสามารถปรับเปลี่ยนลักษณะบางประการของจากคลาสที่ไปสืบทอดคุณสมบัติมาได้ด้วยเรียกว่า overriding

ปกติถ้าไม่ใช้การสืบทอดคุณสมบัติเวลาเขียนคลาสใหม่ก็จะต้องไปก็อปปี้คลาสเดิมแล้วมาสร้างคลาสใหม่เวลาเกิด error ก็ต้องนั่งแก้ทุกจุดทำให้ลำบาก แบบเขียนยาวแล้วแก้ยาก แต่ถ้าสืบทอดคุณสมบัติมาก็แก้แค่จุดเดียวเป็นต้น

คลาสแม่และคลาสลูก(superclass and subclass)

คลาสลูกคือคลาสที่ไปสืบทอดคุณสมบัติมาจากคลาสอื่น ส่วนคลาสที่ถูกเขาสืบทอดคุณสมบัติไปเรียกว่าคลาสแม่ เช่น คลาส B สืบทอดคุณสมบัติจากคลาส A คลาสจะเป็นคลาสแม่ ส่วนคลาส B จะเป็นคลาสลูก วิธีการสืบทอดคุณสมบัติจะใช้คีย์เวิร์ด extends

Modifier cass ชื่อคลาสลูก extends ชื่อคลาสแม่{ }

            เมื่อมีการสืบทอดคุณสมบัติแล้วมีการเปลี่ยนแปลงเกิดขึ้นกับคลาสแม่ ผลของการเปลี่ยนแปลงจะส่งมาที่คลาสลูกอัตโนมัติ สิ่งที่คลาสแม่สามารถสืบทอดคุณสมบัติไปให้คลาสลูกได้ ได้แก่ ตัวแปรคลาสแม่และเมท็อดภายใน คือเมื่อคลาสลูกสืบทอดคุณสมบัติไปแล้วจะสามารถเรียกใช้ตัวแปรและเมท็อดจากคลาสแม่ได้เหมือนกับคลาสลูกสร้างมันขึ้นมาเอง แต่อย่างไรก็ตามถ้าคลาสแม่มีสิ่งที่ถูกประกาศเป็น private ในคลาสแม่ สิ่งนั้นจะไม่สามารถถ่ายทอดมายังลูกได้ และอีกประการคือคอนสตรัคเตอร์ก็จะไม่ถ่ายทอดมายังลูก เปรียบเหมือนแม่มีคุณสมบัติสูง 170 แต่คุณสมบัติไม่จำเป็นต้องเป็นของลูก ลูกอาจสูง 180 ก็ได้

การสืบทอดคุณสมบัติบางครั้งก็ต้องมีการเปลี่ยนแปลงแก้ไข เช่น การเพิ่มตัวแปรและเมท็อดอื่นๆในคลาสลูกเพิ่มเติม

 

รูป10-1

            กลับมีที่คลาส Box อีกครั้ง ในคลาสนี้ปรกาศตัวแปร width, height, depth และสร้างคอนสตรัคเตอร์ 2 คอนสตรัคเตอร์ คือ default constructor กับคอนสตรัคเตอร์แบบรับพารามิเตอร์ จากนั้นก็สร้างเมท็อดสำหรับคำนวณ

 

รูป10-2

            สร้างคลาส BoxWeight โดยให้คลาส BoxWeight สืบทอดคุณสมบัติมาจากคลาส Box ด้วยคีย์เวิร์ด extends ในบรรทัดที่ 2

บรรทัดที่ 4 : ประกาศตัวแปร weight เพื่อเก็บค่าน้ำหนักของกล่อง

บรรทัดที่ 6 : สร้างคอนสตรัคเตอร์ของคลาส BoxWeight จะเห็นว่าในคอนสตรัคเตอร์ของ BoxWeight( ) มีตัว

แปร width, height, depth แบบเดียวกับคลาส Box โดยที่ไม่ต้องประกาศตัวแปร เพราะ BoxWeight( ) ได้ทำการสืบทอดคุณสมบัติมาจาก Box ดังนั้น ตัวแปรคลาสและเมท็อด volume ของ Box นั้น BoxWeight( )ก็จะสามารถใช้งานได้

บรรทัดที่ 8 : ถ้าไม่สร้าง default constructor ในบรรทัดที่ 7 ของคลาส Box จะต้องใส่พารามิเตอร์ในคีย์เวิร์ด

super ตรงนี้แทน ไม่อย่างนั้นจะ error

 

รูป10-3

บรรทัดที่ 6-7 : new อ็อปเจ็คจากคลาส BoxWeight

บรรทัดที่ 10 : เรียกเมท็อด volume ที่เรียกได้ก็เพราะ BoxWeight สืบทอดเมท็อดนี้มาแล้ว

บรรทัดที่ 12 : เรียกตัวแปร weight ของ BoxWeight มาแสดงผล

ผลลัพธ์

 

รูป10-4

Overriding

คือการแก้ไขเมท็อดที่สืบทอดมาจากคลาสแม่ หรือก็คือการเปลี่ยนแปลงเพิ่มเติมตัวแปรและเมท็อดบางอย่างจากคลาสแม่ แต่เมท็อดนั้นต้องชื่อเหมือนกันและรับพารามิเตอร์เหมือนกัน

 

รูป10-5

สร้างคลาสชื่อ Overriding ประกาศตัวแปร a กับ b จากนั้นสร้างคอนสตรัคเตอร์รับพารามิเตอร์ 2 ตัวจากนั้นเก็บค่าไว้ในตัวแปร a b

สร้างเมท็อดชื่อ print สำหรับแสดงค่าออกทางหน้าจอ

 

รูป10-6

สร้างคลาสชื่อ Overriding2 ให้สืบคุณสมบัติมาจาก คลาส Overriding ด้วยคีย์เวิร์ด extends จากนั้นสร้างตัวแปรของคลาส Overriding2 ให้ชื่อ c

ในคอนสตรัคเตอร์ของ Overriding2 เพิ่ม c ลงไป

บรรทัดที่ 10 : นี่คือการ Override คือให้เมท็อดชื่อเหมือนเดิมแต่เปลี่ยนคำสั่งข้างใน จากคลาส Overriding ให้

แสดงค่า a และ b ออกทางหน้าจอ แต่เมท็อดที่สืบทอดคุณสมบัติมาในคลาส Overriding2 ให้แสดงค่า c

 

รูป10-7

บรรทัดที่ 8 : เรียกเมท็อด print( ) จากคลาส Overriding2 โปรแกรมจะแสดง ผลลัพธ์ว่า c : 15 เพราะในคลาส

Overriding2เป็นเมท็อดที่ได้รับการ override แล้ว

Polymorphism การพ้องรูป

สำหรับการพ้องรูปเป้นเรื่องที่มีความเกี่ยวเนื่องกันกับการสืบทอดคุณสมบัติอย่างแยกไม่ออก แปลตามตัวอักษร poly หลาย morph รูปร่าง คือการที่หนึ่งอ็อปเจ็คสามารถมีหน้าที่ได้หลายบทบาท เวลาที่สร้างคลาสแม่ลูกขึ้นมา คลาสแม่จะถือว่าเป็นอะไรที่ใหญ่กว่าคลาสลูก คลาสแม่จะเป็นกรณีทั่วไปแต่คลาสลูกจะเป็นกรณีพิเศษ เช่น คลาสแม่เป็นดอกไม้ มีคุณสมสมบัติคือมีกลีบดอก มีสี คลาสลูกเป็นคลาสดอกมะลิก็จะมีกลีบ มีสีที่เฉพาะเจาะจงกว่าพูดว่าดอกไม้ ดังนั้นสามารถใช้ตัวแปรอ้างอิงของแม่ไปอ้างอิงลูกได้ เช่น Flower f = new Jasmine(); เหมือนบอกว่า ให้คลาส Flower เก็บดอกไม้ สามารถเก็บดอกมะลิได้ แต่ Jasmine j = new Flower(); ไม่ได้ เพราะบอกให้เก็บดอกมะลิ ไม่ใช่ว่าจะไปเก็บดอกไม้อะไรมาให้ก็ได้

 

รูป 10-8

 

รูป10-9

            จากตัวอย่างรูป 10-9 นี้จะเห็นว่าคลาส Rect สืบทอดคุณสมบัติมาจาก Ball แต่ในรูป 10-8 ประกาศอ็อปเจ็ค balls ของ Ball ขึ้นมาเพียงอันเดียว พอจะ new อ็อปเจ็คของคลาส Rect ขึ้นมา ก็สามารถใช้ตัวอ้างอิง ball ไป new ได้เลยเพราะ Rect  เป็นลูกของ Ball

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

ใส่ความเห็น