Java Inheritance
Inheritance คือ คุณสมบัติในการถ่ายทอด Code จาก Class หนึ่งๆให้กับ Class อื่นๆ กล่าวคือ เป็นการแชร์ Code ระหว่าง Class ที่มีลักษณะบางอย่างที่เหมือนกัน
ในการทำ Inheritance คลาสลูก(subclass) จะทำการสืบทอดจาก คลาสแม่(superclass)
ซึ่ง
Class ที่สืบทอดจาก Class อื่นๆ เราเรียกว่า คลาสลูก(subclass)
Class ที่ถูกสืบถอดจาก Class อื่นๆ เราเรียกว่า คลาสแม่(superclass)
ในภาษา Java สนับสนุนการทำ Inheritance เพียง 3 รูปแบบ ดังนี้
เป็นการสืบทอดแบบ 1-1
คลาสลูก สืบทอดจาก คลาสแม่
คลาสลูก(subclass) สามารถ เป็น คลาสแม่(superclass) ของ Class อื่นๆที่สืบมันต่ออีกทีหนึ่งได้
เป็นการสืบทอดแบบ 1-M
คลาสแม่ สามารถมี คลาสลูก ได้หลาย คลาสลูก
แต่ คลาสลูก จะมี คลาสแม่ ได้เพียง 1 เดียวเท่านั้น
การทำ Inheritance ใน Java เมื่อ คลาสลูก สืบทอดจาก คลาสแม่
field และ method ที่ระบุ Access Modifier protected และ public ทั้งหมดยกเว้น Constructor ของคลาสแม่ จะถูกถ่ายทอดให้กับ คลาสลูก
field และ method ที่ระบุ Access Modifier default(package) และ private ไม่ถูกถ่ายทอดให้คลาสลูก
การประกาศ Inheritance ทำได้โดยใช้ keyword ต่อจากชื่อ คลาสลูก ว่า "extends" ตาม ชื่อ คลาสแม่
ตัวอย่าง
ตัวอย่าง code
จะเห็นได้ว่า Animal ที่เป็น คลาสแม่ จะมี Fields และ Method ที่ Cat และ Dog จำเป็นต้องมีเหมือนๆกันนี่แหละคือหัวใจของเรื่องนี้เลย เป็นการแชร์ Code ของ Animal ให้กับ Cat และ Dog ทำให้ไม่ต้องเขียน Code ซ้ำๆของทุกๆ Class ที่เหมือนๆกัน
ในบางคนอาจจะกล่าวเพื่อให้สมเหตุสมผลเป็นคำพูดเชิงตรรกะว่า Cat is a Animal และ Dog is a Animal
และอีกอย่างการทำ Inheritance นั้น คลาสลูก สามารถมี Fields และ Method เป็นของ Class ตัวเองได้
ตัวอย่าง code
ที่ควรจะรู้อีกอย่างคือ Final Classes ไม่สามารถสืบทอดได้นะ
Overriding Methods
ใน คลาสลูก ที่ได้รับสืบทอด Methods มาจาก คลาสแม่ Methods เหล่านั้นสามารถกำหนดพฤติกรรมให้มันใหม่ได้ โดยการ Override Method นั้น จากนั้นมันจะทำให้ Method ที่ได้สืบถอดมาจาก คลาสแม่เดิมนั้นถูกละเว้นไป
หมายเหตุ : Annotation @Override ที่เห็นในตัวอย่างข้างบนนี้ ทำไมต้องใส่? ใส่เพื่อ? เหตุผลที่แนะนำให้ใส่ทุกครั้ง เพราะ ถ้าคุณตั้งใจจะ Override และใส่ชื่อผิด,Typeผิด หรือ Parameterผิดไม่ตรงตามเงื่นไขของการ Override มันจะช่วยแจ้ง Error ให้คุณรู้ทันที แต่ถ้าคุณไม่ใส่ @Override มันจะไม่แจ้งให้คุณทราบและไม่เกิด Error ด้วย มันจะถือว่าเป็น Method สร้างใหม่
Calling SuperClass Method
Method ของ คลาสแม่ที่ถูกถ่ายทอดมาให้คลาสลูกนั้นจะลูกละเว้นไม่ได้ทำงานก็ต่อเมื่อคลาสลูก Override Method ดังกล่าว แต่เรายังสามารถเรียก Method เดิมของคลาสแม่มาทำงานในคลาสลูกได้อยู่
โดยใช้ keyword super ซึ่งคำสั่ง super เป็นการเข้าถึงสมาชิกของ คลาสแม่ นั่นหมายความว่าเราสามารถเข้าถึง field และ method ของคลาสแม่ได้ผ่านคำสั่ง super
อนึ่ง keyword super ยังสามารถเรียกทำงานใน Method อื่นๆ ที่สร้างใหม่ของคลาสลูกได้อีกด้วย
ที่ควรจะรู้อีกอย่างคือ Final Method ไม่สามารถ Override ได้
Fields ไม่สามารถ Override ได้ อันนี้ก็จำไว้ หากเราสร้าง Fields ของคลาสลูกที่มีชื่อเหมือนกันกับ Field ที่สืบทอด จาก คลาสแม่ไป อันนี้จะเป็นเรื่องของ "shadowed" ซึ่งจะกล่าวในบทความอื่นๆ
Constructors and Inheritance
Constructor ไม่สามารถสืบทอดได้ แต่ใน คลาสลูกสามารถเรียก Constructor ของ คลาสแม่ทำงานได้โดยใช้ คำสั่ง super
แต่ในความเป็นจริงแล้ว Constructor ของคลาสลูกจะเรียกใช้ Constructor ของคลาสแม่ทำงานตลอดอยู่แล้วเราเพียงแค่ไม่เห็นมัน Compiler จะใส่ให้อัติโนมัส มันจะเรียก No-Parameter Constructor ของคลาสแม่ทำงาน
ตัวอย่าง code
ถ้าหากคุณไม่ได้กำหนด Constructor ให้ คลาสแม่ และ คลาสลูก
Compiler เวลาอ่านจะใส่ให้แบบนี้
ถ้าหากกรณีที่คุณ กำหนด Constructors ของคลาสแม่เอง โดยไม่มี No-Parameter Constructor แต่มี Constructors ที่มี Parameter แทน Compiler จะบ่นคุณให้คุณเรียก Constructor ของคลาสแม่ทำงานใน Constructor ของ คลาสลูก หากมีหลาย Constructor จงจำไว้ Constructor ของคลาสลูก 1 อัน ต้องเรียก Constructor ของคลาสแม่ ทำงาน 1 อันเท่านั้น
ตัวอย่าง code
เข้าใจง่ายดีครับ ขอบคุณครับ
ตอบลบ