Encapsultion

จุดประสงค์

  • อธิบายความหมายของ 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 รูปแบบคือ

  1. กรอกเฉพาะชื่อและเกรดในกรณีที่รายวิชานั้นมีจำนวนหน่วยกิตเป็น 3

  2. กรอก ชื่อ,จำนวนหน่วยกิต,เกรด ในกรณีที่จำนวนหน่วยกิตไม่เป็น 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}