Polymorphism¶
จุดประสงค์¶
อธิบายความหมายของ Polymorphism ได้
อธิบายประเภทต่างๆ ของ Polymorphism ได้
เขียนคำสั่งเพื่อยกตัวอย่างใน Polymorphism แต่ละประเภทได้
ใช้หลักการเขียนคำสั่ง Polymorphism เพื่อพัฒนาโครงงานได้
ความหมาย¶
คำว่า Polymorphism ในศาสตร์วิทยาการคอมพิวเตอร์ หมายถึง หลักการเขียนโปรแกรมเพือ (1) ให้ฟังก์ชันสามารถรองรับข้อมูลนำเข้าได้หลายรูปแบบ และ (2) ตัวแปรชื่อเดียวสามารถแทนข้อมูลได้หลายประเภท
ประเภท¶
Polymorphism แบ่งออกเป็น 3 ประเภทได้แก่
Ad hoc Polymorphism
Parametric Polymorphism
Subtyping Polymorphism
Ad hoc Polymorphism¶
หมายถึง ฟังก์ชัน (function) หรือเครื่องหมาย (operator) ที่รองรับการทำงานหลายแบบ (overloading)
Function Overloading¶
ตัวอย่างฟังก์ชันชื่อ add() ในคลาสชื่อ ScoreKeeper ที่สามารถเรียกรับตัวเลขได้หลายแบบและสามารถรับได้มากกว่า 1 ค่า
1a = ScoreKeeper('มานะ')
2a.add(80)
3a.add(75.5)
4a.add(90.5)
5print(a.getName(), a.getAverage())
6
7b = ScoreKeeper('มานี')
8b.add(75, 84.2, 90.8)
9print(b.getName(), b.getAverage())
>>> มานะ 82.0
>>> มานี 83.33333333333333
Exercise¶
- Ex0601:
จงเขียนโปรแกรมเพื่อสร้างประกาศและเรียกใช้ ScoreKeeper เพื่อให้สามารถอ่านและแสดงคะแนนเฉลี่ยของทุกคนจากไฟล์ต่อไปนี้
มานะ,30,20,30
ปิติ,20.5,34.56
ชูใจ,25
มานะ,30,33,40
ชูใจ,20,33
มานะ,25.5,26.5,30.9
- Ex0602:
จงเขียนคลาสชื่อ Student เพื่อจัดเก็บข้อมูลผลการเรียนของนักศึกษาแต่ละคน โดยผลการเรียนแต่ละวิชาประกอบไปด้วย จำนวนหน่วยกิต (unit) และเกรด (gpa) เช่น วิชาหนึ่งมี 3 หน่วยกิตและได้เกรด 3.50 เป็นต้น โปรแกรมจะให้ผู้ใช้กรอกจำนวนบรรทัดของข้อมูลนำเข้า n บรรทัด จากนั้นใน n บรรทัดที่เหลือ ผู้ใช้จะกรอกชื่อนักศึกษาพร้อมผลการเรียนได้ 2 รูปแบบคือ
กรอกเฉพาะชื่อและเกรดในกรณีที่รายวิชานั้นมีจำนวนหน่วยกิตเป็น 3
กรอก ชื่อ,จำนวนหน่วยกิต,เกรด ในกรณีที่จำนวนหน่วยกิตไม่เป็น 3
จงเติมคำสั่งของคลาส Student ให้สมบูรณ์ โดยเลือกใช้ภาษาที่ถนัด
8
มานะ,3.5
ปิติ,3,4.0
ชูใจ,3.5
มานะ,3,3.0
ชูใจ,3,3.5
ชูใจ,2,4.0
มานะ,3,4.0
ปิติ,4.0
มานะ 3.5
ปิติ 4.0
ชูใจ 3.625
Operator Overloading¶
หมายถึง ฟังก์ชันหรือ operator ที่ทำงานได้หลายแบบ ในหลักการเชิงวัตถุจะช่วยให้สามารถเรียกใช้เครื่องหมายเช่น +, -, *, / แทนการเรียกใช้ method หรือฟังก์ชันของ object
ตัวอย่างการเขียนคลาส ScoreKeeper ให้สามารถใช้เครื่องหมาย + ได้
1a = ScoreKeeper('มานะ', 0.0)
2a.add(77.0, 73.0, 80.0)
3
4b = ScoreKeeper('มานะ', 0.0)
5b.add(79.0, 75.0, 73.5, 80.0)
6
7c = a + b
8print( c.getName(), c.getAverage() )
ตัวอย่างคำสั่งต่อไปนี้แสดงการเขียนคลาส ScoreKeeper เพื่อให้สามารถใช้เครื่องหมาย + ได้ตามตัวอย่างการใช้งาน
Exercise¶
- Ex0603:
จงปรับคลาส Student ใน Ex0602 เพื่อให้สามารถใช้เครื่องหมาย - ระหว่าง object ของคลาส Student ได้ และสามารถใช้คำสั่งต่อไปนี้เพื่อสร้างและลบผลการเรียนดังคำสั่งตัวอย่างต่อไปนี้ได้
1a = Student('มานะ') 2a.add(3.0) 3a.add(3, 4.0) 4a.add(2, 2.5) 5a.add(2, 4.0) 6 7b = Student('มานะ') 8b.add(2, 4.0) 9 10c = a - b 11print( c.getName(), c.getAverage() )
มานะ 3.5
ปิติ 3.25
ชูใจ 3.5625
Parametric Polymorphism¶
หมายถึง คลาสหรือฟังก์ชันที่ (ชื่อเดียว) แต่สามารถระบุประเภทของข้อมูลที่จะรองรับได้ เรียกอีกอย่างว่า generic หรือ template
Function¶
ตัวอย่างการเขียน Generic Function ชื่อ setName() ใน class ScoreKeeper เขียนด้วยภาษา Java และการเรียกใช้
Exercise¶
- Ex0604:
จงปรับฟังก์ชัน add() ในคลาส Student เพื่อให้สามารถรับข้อมูลได้ทั้ง จำนวนเต็ม และ ทศนิยม
1Student a = new Student("มานะ"); 2a.add(2); 3a.add(3, 3); 4a.add(3.0, 4.0); 5a.add(2, 4); 6System.out.printf("%s %.2f%n", a.getName(), a.getAverage() );
Class¶
Exercise¶
- Ex0605:
จงปรับคลาส Student เพื่อให้สามารถรับข้อมูลได้ทั้ง จำนวนเต็ม และ ทศนิยม
1Student<Integer> a = new Student<Integer>("มานะ"); 2a.add(2); 3a.add(3, 3); 4System.out.printf("%s %.2f%n", a.getName(), a.getAverage() ); 5Student<Integer> b = new Student<Integer>("มานี"); 6b.add(2.0); 7b.add(3.0, 3.5); 8System.out.printf("%s %.2f%n", b.getName(), b.getAverage() );
Subtyping Polymorphism¶
หมายถึง ความสามารถใช้ object ของ subclass แทนตำแหน่งที่ระบุว่าต้องการ object ของ superclass
Function¶
Exercise¶
- Ex0606:
จงประกาศคลาส Hero และ NPC เพื่อให้สามารถเรียกใช้คำสั่งต่อไปนี้ได้
1public class GameApp { 2 public static void fight(GameCharacter a, GameCharacter b) { 3 a.fight(b); 4 } 5 public static void main(String[] args) { 6 Hero batman = new Hero("Batman", 100); 7 NPC zbot = new NPC("Zombie", 20); 8 System.out.println("batman hp = "+batman.getHP()); 9 // ผลลัพธ์ "batman hp = 100" 10 fight(batman, zbot); 11 System.out.println("batman hp = "+batman.getHP()); 12 // ผลลัพธ์ "batman hp = 80" 13 } 14}
Class¶
Exercise¶
- Ex0607:
จงประกาศคลาส Hero และ NPC เพื่อให้สามารถเรียกใช้คำสั่งต่อไปนี้ได้
1public class CharacterApp<T> { 2 private T c; 3 public CharacterApp(T c) { 4 this.c = c; 5 } 6 public void combat(Character b) { 7 c.fight(b); 8 } 9 public static void main(String[] args) { 10 Hero batman = new Hero("Batman", 100, 15); 11 Hero superman = new Hero("Superman", 200, 25); 12 NPC zbot = new NPC("Zombie", 20); 13 14 CharacterApp<Hero> b = new CharacterApp<>(batman); 15 CharacterApp<Hero> s = new CharacterApp<>(superman); 16 b.print(); // "Batman HP:100 Damage:15 17 b.combat(zbot); 18 b.print(); // "Batman HP:80 Damage:15 19 b.combat(s); 20 b.print(); // "Batman HP:55 Damage:15 21 } 22}