บทที่ 8 - wathinee . reru . ac . th

Download Report

Transcript บทที่ 8 - wathinee . reru . ac . th

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
Argument
parameter
 การสื บทอด (Inheritance) (ต่อจากบทก่อนหน้า)
คลาสที่ใช้ศึกษา
Animal
+ age : int
+ eat()
+ sleep()
extends
Dog
+ name: String
+ eat()
extends
Fish
+ sleep()
+ swim()
สร้าง 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 ลูก
Animal
ทางานได้โดยผ่านทาง reference ของclass + age : int
แม่ได้
+ eat()
+ sleep()
Animal a=new Dog();
a.eat();
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 เมธอด
1.
2.
3.
ชื่อ method เหมือนกัน
argument ของแต่ละ method ต้องแตกต่างกัน เพื่อจะได้สามารถ
แยกความแตกต่างระหว่างเมธอดเหล่านั้นได้
ค่าที่ส่งคืนกลับออกไปจาก method (return type) จะเหมือนหรื อ
แตกต่างกันก็ได้
คาเตือน
อย่าจาสับสันนะคะ กับคาว่า
Override และ Overload
สร้ าง class “Employee”
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
name ที่ input เข้ามา
จะนาไปกาหนดค่าให้กบั
this.name
1
2
this.name คือ name
ที่เป็ น attribute ของclass
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
ทดสอบเรี ยก constructor ของ class ลูก กรณี มี parameter=16
constructor ของ class แม่และ class ลูก เป็ นส่ วนที่แยกออกจากกันไม่สามารถ
สื บทอดให้กนั ได้
constructor ของ class แม่และ class ลูก เป็ นส่ วนที่แยกออกจากกันไม่สามารถ
สื บทอดให้กนั ได้
เรี ยกใช้ constructor โดยใช้ super() ,this()
class ลูกสามารถเรี ยกใช้ constructor ของ class แม่ได้โดย super()
 และเรี ยกใช้ constructor ของ class ตัวเองโดยใช้ this()

โดยมีเงื่อนไขว่า เมื่อใช้ super() และ this()
1. ต้องเรี ยกคาสัง่ นี้ ที่บรรทัดแรกภายใน constructor
็ อ้ งมีใน constructor ของ class นั้นๆ ด้วย
2. และparameter ที่ใช้กต
เช่น 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 ดังนี้
class ลูกสามารถเรี ยกใช้ constructor ของ class ลูก(ตัวเอง)ได้โดย this()
ให้แก้ไขเพิ่มเติม class B ดังนี้
class ลูกสามารถเรี ยกใช้ constructor ของ class ลูก(ตัวเอง)ได้โดย this()
ให้แก้ไขเพิ่มเติม class B ดังนี้
จากข้อมูล
เงื่อนไขการใช้ super() และ this()
1. ต้องเรี ยกคาสัง่ super() ,this() นี้ ที่บรรทัดแรกภายใน constructor
็ อ้ งมีใน constructor ของ class นั้นๆ ด้วย
2. และparameter ที่ใช้กต
เช่น 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.