Object-Oriented Programming การเขียนโปรแกรมเชิงวัตถุ ผู้สอน อ.วาทินี ดวงอ่อนนาม
บทที่ 8 การสืบทอด (Inheritance) ตอนที่ 2 การพ้องรูป Polymorphism และ Constructor
เนื้อหา Reference ของ class แม่สามารถอ้างถึง class ลูกได้ การพ้องรูป Polymorphism รู้จักคำว่า Overloading การ Overload Constructor และการใช้ this เรียกใช้ constructor ของ classแม่ ด้วย super() เรียกใช้ constructor ของ class ลูก(ตัวเอง ) ด้วย this()
note :argument และ parameter
การสืบทอด (Inheritance) (ต่อจากบทก่อนหน้า)
คลาสที่ใช้ศึกษา Animal + age : int + eat() + sleep() Dog + name: String + eat() Fish + sleep() + swim() extends extends
สร้าง class ต่าง ๆ
Reference ของ class แม่สามารถอ้างถึง class ลูกได้ ปกติเราจะสร้าง วัตถุโดย หมายเหตุ ตัวแปรinstance, reference,ตัวแปรObject ชื่อคลาส reference=new ชื่อคลาส(); เช่น Dog d=new Dog();
Reference ของ class แม่สามารถอ้างถึง class ลูกได้ แต่ในกรณีที่วัตถุอยู่ใน class ที่สืบทอด มาจาก class อื่นเราสามารถให้ reference ของclass แม่ อ้างถึงวัตถุใน class ลูกได้ ชื่อคลาสแม่ reference=new ชื่อคลาสลูก(); เช่น Animal a=new Dog(); Animal + age : int + eat() + sleep() Dog + name: String + eat()
Reference ของ class แม่สามารถอ้างถึง class ลูกได้ เราสามารถสั่งให้วัตถุใน class ลูกทำงานได้โดยผ่านทาง reference ของclass แม่ได้ Animal a=new Dog(); a.eat(); Animal + age : int + eat() + sleep() Dog + name: String + eat()
กรณี class ลูก override method
กรณี class ลูก override method Animal + age : int + eat() + sleep() Dog + name: String + eat()
กรณี class ลูก ไม่ได้ override method Animal + age : int + eat() + sleep() Fish +sleep() +swim()
กรณี class ลูก ไม่ได้ override method
กรณี class ลูก ไม่ได้ override method Animal + age : int + eat() + sleep() Fish +sleep() +swim()
หมายเหตุ เราสามารถใช้ reference คลาสแม่อ้างถึงวัตถุคลาสลูก ซึ่งจะเรียกได้เฉพาะเมธอดที่มีใน class แม่เท่านั้น เราเรียกเมธอด อื่นๆ จะทำให้ คอมไพล์ไม่ผ่าน
กรณี class แม่เรียกสิ่งที่ไม่มีใน class แม่ Animal + age : int + eat() + sleep() Fish +sleep() +swim()
กรณี class แม่เรียกสิ่งที่ไม่มีใน class แม่ Animal + age : int + eat() + sleep() Fish +sleep() +swim()
การพ้องรูป Polymorphism
การพ้องรูป Polymorphism คืออะไร คือ การทำให้สิ่งหนึ่งสามารถทำงานได้หลากหลายรูปแบบตามความต้องการที่เกิดขึ้นในขณะหนึ่ง ๆ เช่นการที่ Method ชื่อเดียวกันสามารถรับค่าที่ส่งมาแตกต่างกันได้หลายรูปแบบ
Polymorphism การพ้องรูป ยกตัวอย่าง Method void calculate(int x) { } void calculate(double y) { } หากมีผู้ใช้โปรแกรมส่งข้อมูลเข้ามาเป็นตัวเลขจำนวนเต็ม เราก็สามารถเรียกเมธอด calculate(int x) ให้ทำงาน หากผู้ใช้โปรแกรมส่งข้อมูลเลขทศนิยมเข้ามาเราก็สามารถเรียกคำนวณให้ละเอียดมากขึ้นโดยเรียกเมธอด calculate(double y) โดยไม่ต้องไปตั้งชื่อเมธอดใหม่ เพียงแค่ตั้งค่า อาร์กิวเมนต์ที่แตกต่างกัน มีศัพท์เรียกเฉพาะว่า เมธอดชื่อนั้นถูก “Overload”
Overloading & Polymorphism 2 คำนี้เกี่ยวข้องกันอย่างไร ? Overloading คือ การกำหนดให้ method หรือ constructor ที่มีชื่อเดียวกัน มี argument ที่แตกต่างกัน ทำให้ method หรือ constructor ดังกล่าวมีคุณสมบัติการพ้องรูป
กฎในการ Overload เมธอด ชื่อ method เหมือนกัน argument ของแต่ละ method ต้องแตกต่างกัน เพื่อจะได้สามารถแยกความแตกต่างระหว่างเมธอดเหล่านั้นได้ ค่าที่ส่งคืนกลับออกไปจาก method (return type) จะเหมือนหรือแตกต่างกันก็ได้
อย่าจำสับสันนะคะ กับคำว่า Override และ Overload คำเตือน อย่าจำสับสันนะคะ กับคำว่า Override และ Overload
สร้าง class “Employee” + name : String + salary : double +getDetails() +getDetails(name :String) :String +getDetails(s:double) : double
เรียก getDetails() ที่ได้ส่ง parameter
เรียก getDetails(“ชาติชาย”) parameter =“ชาติชาย”
เรียก getDetails(30000) , parameter=30000.0
Constructor (คอนสตรัคเตอร์)
Constructor (คอนสตรัคเตอร์) เป็นส่วนที่ประกอบด้วยคำสั่งที่จำเป็นสำหรับการกำหนดค่าเริ่มต้นให้กับ attribute ต่าง ๆ ของ Object โดย Constructor จะถูกเรียกให้ทำงานโดยอัตโนมัติ (default constructor) เมื่อเราสร้าง Object จาก class ด้วย New
Student + name : String + grade : double
หน้าตาของ constructor คล้ายเมธอดแต่ต่างกันตรงที่ ชื่อต้องเหมือนกันกับ class (แต่เมธอดชื่อต้องไม่เหมือนกับชื่อclass) ไม่มี return type
access modifier ของconstructor เหมือนกับ class
หากเราต้องการจะสร้าง constructor ขึ้นเอง constructor ที่สร้างขึ้นเองสามารถระบุให้มีหรือไม่มีargument ก็ได้ สร้างกี่อันก็ได้ ใน class หนึ่ง ๆ แต่ constructor แต่ละอันจะต้องมี argument ไม่เหมือนกัน สรุป มีชื่อเหมือนกันแต่ต่างกันที่ argument เราเรียก constructor เหล่านี้ว่า “overloaded constructor”
การ overload Constructor และการ ใช้ this
class Student this.แอตทริบิวต์ , this.เมธอด() 1 name ที่ input เข้ามา จะนำไปกำหนดค่าให้กับ this.name 2 this.name คือ name ที่เป็น attribute ของclass 2 1 this.แอตทริบิวต์ , this.เมธอด() เป็นการอ้างถึง แอตทริบิวต์ และเมธอด ของ class นี้
Default Constructor
เรียก Constructor โดย parameter=“Student A”
เรียก Constructor โดย parameter=“Student A”,4.00
Constructor ในclass แม่จะไม่ถูกถ่ายทอดให้ class ลูก class แม่จะถ่ายทอดแค่ attribute และ method เท่านั้น(ต้องประกาศเป็น public และ protected ด้วย)แต่ constructor ใน class แม่จะไม่ถูกถ่ายทอดไปยัง class ลูก สรุป constructor ของ class แม่และ class ลูก เป็นส่วนที่แยกออกจากกันไม่สามารถสืบทอดให้กันได้ แต่ class ลูกสามารถเรียกใช้ constructor ของ class แม่ได้
สร้าง class A, class B ดังนี้
ทดสอบเรียก constructor ของ class แม่ กรณี ไม่มี parameter
ทดสอบเรียก constructor ของ class แม่ กรณี มี parameter
เมื่อ Default constructor เริ่มทำงาน นอกจาก default constructor จะทำการกำหนดค่าเริ่มต้นให้กับ attribute และ method แล้ว อีกสิ่งที่ default constructor ทำคือ เมื่อ default constructor ของ class ลูกทำงานจะไปเรียก default constructor ของบรรพบุรุษ ให้ทำงานด้วย
ทดสอบเรียก constructor ของ class ลูก กรณี ไม่มี parameter 1 2
ทดสอบเรียก constructor ของ class ลูก กรณี มี parameter=16 2
constructor ของ class แม่และ class ลูก เป็นส่วนที่แยกออกจากกันไม่สามารถสืบทอดให้กันได้
constructor ของ class แม่และ class ลูก เป็นส่วนที่แยกออกจากกันไม่สามารถสืบทอดให้กันได้
เรียกใช้ constructor โดยใช้ super() ,this() class ลูกสามารถเรียกใช้ constructor ของ class แม่ได้โดย super() และเรียกใช้ constructor ของ class ตัวเองโดยใช้ this() โดยมีเงื่อนไขว่า เมื่อใช้ super() และ this() ต้องเรียกคำสั่งนี้ที่บรรทัดแรกภายใน constructor และparameter ที่ใช้ก็ต้องมีใน constructor ของ class นั้นๆ ด้วย เช่น super(5) class A (class แม่) ต้องมี A(int x){} this(5.0) class B (class ลูก) ต้องมี B(double x){} ไม่เช่นนั้นจะคอมไพล์ไม่ผ่าน
class ลูกสามารถเรียกใช้ constructor ของ class แม่ได้โดย super() ให้แก้ไขเพิ่มเติม class B ดังนี้ 2 1 3
class ลูกสามารถเรียกใช้ constructor ของ class แม่ได้โดย super() ให้แก้ไขเพิ่มเติม class B ดังนี้ 1 2 3
class ลูกสามารถเรียกใช้ constructor ของ class ลูก(ตัวเอง)ได้โดย this() ให้แก้ไขเพิ่มเติม class B ดังนี้
class ลูกสามารถเรียกใช้ constructor ของ class ลูก(ตัวเอง)ได้โดย this() ให้แก้ไขเพิ่มเติม class B ดังนี้ 1 2 3 4
จากข้อมูล เงื่อนไขการใช้ super() และ this() ต้องเรียกคำสั่ง super() ,this() นี้ที่บรรทัดแรกภายใน constructor และparameter ที่ใช้ก็ต้องมีใน constructor ของ class นั้นๆ ด้วย เช่น super(5) class A (class แม่) ต้องมี A(int x){} this(5.0) class B (class ลูก) ต้องมี B(double x){} ไม่เช่นนั้นจะคอมไพล์ไม่ผ่าน
ต้องเรียกคำสั่งนี้ที่บรรทัดแรกภายใน constructor
ต้องเรียกคำสั่งนี้ที่บรรทัดแรกภายใน constructor
เรียกใช้ constructor ที่ไม่มีอยู่จริง จะเห็นว่าไม่มี B(String s){}
สรุป หลักการพื้นฐานของ object oriented Encapsulation และ Information Hiding การห่อหุ้ม และ การซ่อนรายละเอียด Inheritance การสืบทอด และ (Reusable) การนำวัตถุมาใช้ใหม่ Polymorphism การพ้องรูป
The End.