Home / ພື້ນຖານ Java / Polymorphism
Polymorphism ຄືການທີ່ອອບເຈັກສາມາດມີໄດ້ຫຼາຍຮູບແບບ ເຊິ່ງເກີດຈາກການສືບຕອດຈາກ super class ແລະ ມັນຍັງຄົງຖືກຮັກສາສະພາບ ແລະ ຄຸນສົມບັດຂອງ super class ໄວ້ ເຊັ່ນ ຜູ້ຄົນໃນໂລກ ຈະມີທັງນັກກີລາ ນັກຮ້ອງ ນັກດົນຕີ ເຊິ່ງມັນກໍ່ຄື ການມີຫຼາຍຮູບແບບທາງອາຊີບຂອງບຸກຄົນ ເຊິ່ງເຮົາສາມາດໃຊ້ຄຳວ່າ ບຸກຄົນ ໃນການອ້າງເຖິງຄົນໃນອາຊີບຕ່າງໆ ໄດ້ ເຊິ່ງເປັນແນວຄິດຂອງ polymorphism ໃນການຂຽນໂປຣແກຣມ ເຊິ່ງມັນຄວາມຫມາຍຂອງມັນຄືການມີໄດ້ຫຼາຍຮູບແບບ
ໃນການຂຽນໂປຣແກຣມເຊີງວັດຖຸ Polymorphism ນັ້ນຄືການສ້າງອອບເຈັກໂດຍເປັນອອບເຈັກທີ່ສ້າງມາຈາກຄາດທີ່ມີ Super class ດຽວກັນ ໂດຍໃນ Sub class ນັ້ນໄດ້ມີການກຳນົດການເຮັດວຽກງານໃໝ່ໃຫ້ກັບເມຕອດໃຫ້ກົງກັບວັດຖຸປະສົງຂອງຄາດນັ້ນ ຫລື ການ Override method ຫຼັງຈາກນັ້ນເຮົາສາມາດໃຊ້ Super class ສຳລັບການປະກາດຕົວແປຣຂອງອອບເຈັກ (class instance) ທີ່ສ້າງອອບເຈັກຈາກ Sub class ໄດ້
ຕໍ່ໄປເປັນຕົວຢ່າງຂອງການໃຊ້ງານຄຸນສົມບັດ polymorphism ໃນພາສາ Java ໂດຍເຮົາຈະມີຄາດ Person ສຳລັບເປັນ super class ແລະ ສ້າງຄາດອື່ນເພື່ອສືບຕອດຈາກຄາດນີ້
public class TestPolymorphism {
public static void main (String[] args) {
Person person1, person2, person3;
person1 = new Person("Mark", 1980);
person2 = new Sheriff("Mateo", 1981, "California");
person3 = new Police("Danny", 1986, "NYC");
person1.introduce();
person2.introduce();
person3.introduce();
}
}
class Person {
String name;
int bornYear;
public Person (String name, int bornYear) {
this.name = name;
this.bornYear = bornYear;
}
public void introduce () {
System.out.print("My name is " + name + ",");
System.out.println(" I was born in " + bornYear + ".");
}
}
class Sheriff extends Person {
String workState;
public Sheriff (String name, int bornYear, String workState) {
super(name, bornYear);
this.workState = workState;
}
@Override
public void introduce () {
super.introduce();
System.out.println("I'm a sheriff and work in " +
workState + ".");
}
}
class Police extends Person {
String workCountry;
public Police (String name, int bornYear, String workCountry) {
super(name, bornYear);
this.workCountry = workCountry;
}
@Override
public void introduce () {
super.introduce();
System.out.println("I'm a police and work in " +
workCountry + ".");
}
}
ໃນຕົວຢ່າງ ນັ້ນເຮົາມີຄາດ Person ທີ່ເປັນ super class ເຮົາໄດ້ສ້າງ delivered class ມາສອງຄາດຄື Sheriff ແລະ Police ນັ້ນຄືເປັນຄາດທີ່ສືບຕອດຄຸນສົມບັດຂອງຕົວແປຣ ແລະ ເມຕອດມາຈາກຄາດ Person
ໃນ delivered class ທັງສອງ ເຮົາໄດ້ມີການສ້າງ override ເມຕອດ introduce ເພື່ອສະແດງຂໍ້ມູນເພິ່ມເຕີມ ແລະ ຕໍ່ໄປເປັນການໃຊ້ງານຄຸນສົມບັດຂອງ polymorphism ໃນຈາກໂຄ້ດ
Person person1, person2, person3;
person1 = new Person("Mark", 1980);
person2 = new Sheriff("Mateo", 1981, "California");
person3 = new Police("Danny", 1986, "NYC");
ໃນຕອນນີ້ ເຮົາໄດ້ໃຊ້ຄາດ Person ໃນການປະກາດອອບເຈັກ (instances) ມາ 3 ຕົວແປຣ ແລະ ເຮົາໃຊ້ instances ຂອງຄາດນີ້ໃນການສ້າງອອບເຈັກຈາກຄາດຕ່າງໆ ເຊິ່ງກໍ່ຄື Person, Sheriff ແລະ Police ນັ້ນໝາຍຄວາມວ່າ ຕົວແປຣທີ່ສ້າງຈາກຄາດ Person ນັ້ນມີໄດ້ຫຼາຍຮູບແບບ ໃນຕົວຢ່າງນັ້ນມີ 3 ແບບນຳກັນ
person1.introduce();
person2.introduce();
person3.introduce();
ຕໍ່ມາເປັນການຮຽກໃຊ້ງານເມຕອດ introduce ຂອງແຕ່ລະອອບເຈັກເຊິ່ງສ້າງມາຈາກຄາດທີ່ແຕກຕ່າງກັນ ສຳລັບ delivered class ນັ້ນເມຕອດ introduce ຖືກເຮັດການ override ເພື່ອໃຫ້ສະແດງຂໍ້ມູນເພິ່ມເຕີມ
ຂໍ້ໄດ້ປຽບຂອງ polymorphism ຄືການທີ່ສາມາດຈັດການກັບອອບເຈັກທີ່ສືບຕອດມາຈາກຄາດດຽວກັນໄດ້ ໂດຍໃຊ້ super class ຂອງມັນໃນການປະກາດອອບເຈັກ
My name is Mark, I was born in 1980.
My name is Mateo, I was born in 1981.
I'm a sheriff and work in California.
My name is Danny, I was born in 1986.
I'm a police and work in NYC.
ໝາຍເຫດ: ໃນການໃຊ້ instances ທີ່ສ້າງຈາກ super class ສາມາດໃຊ້ໄດ້ກັບຕົວແປຣ ຫລື ເມຕອດທີ່ມີຢູ່ໃນ super class ຫລື ທີ່ໄດ້ຮັບການ override ເທົ່ານັ້ນ ຍົກຕົວຢ່າງເຊັ່ນ ຖ້າເຮົາສ້າງເມຕອດ ຫລື ຕົວແປຣໃໝ່ໃນ delivered class ເຮົາບໍ່ສາມາດໃຊ້ມັນໄດ້ຜ່ານ instance ຂອງ super class ໄດ້ ເຮົາຈະເວົ້າກ່ຽວກັບເລື່ອງນີ້ໃນເລື່ອງ interface ແລະ abstract class
ເພື່ອໃຫ້ເຮົາເຂົ້າໃຈກ່ຽວກັບ Polymorphism ຫຼາຍຂຶ້ນ ມາເບິ່ງຕົວຢ່າງໃນການຂຽນໂປຣມໃນການໃຊ້ງານກັບອາເຣ ແລະການເຮັດວຽກງານໂດຍສົ່ງເປັນພາຣາມິເຕີຂອງຟັງຊັ່ນ
import java.util.ArrayList;
public class Polymorphism {
public static void main(String[] args) {
ArrayList<Shape> shapes = new ArrayList<Shape>();
shapes.add(new Rectangle());
shapes.add(new Triangle());
for (Shape shape : shapes) {
drawShape(shape);
}
}
public static void drawShape(Shape shape) {
shape.draw();
}
}
class Shape {
public void draw() {
System.out.println("Perform draw from base class");
}
}
class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("Draw rectangle");
super.draw();
}
}
class Triangle extends Shape {
@Override
public void draw() {
System.out.println("Draw triangle");
super.draw();
}
}
ໃນຕົວຢ່າງ ເຮົາມີຄາດ Shape ໃນການກຳນົດຮູບຊົງ ເຊິ່ງຄາດນີ້ມີເມຕອດ draw() ເພື່ອເປັນກາຣແຕ້ມຮູບຊົງໃນຄາດ ແລະ ຕໍ່ມາເຮົາໄດ້ສ້າງອີກສອງຄາດຄື Rectangle ແລະ Triangle ທີ່ມີການສືບຕອດມາຈາກຄາດ Shape ແລະ ເຮັດການ Override ເມຕອດ draw() ເພື່ອໃຫ້ສອດຄ່ອງກັບການເຮັດວຽກງານຂອງຄາດທັງສອງ
ArrayList<Shape> shapes = new ArrayList<Shape>();
shapes.add(new Rectangle());
shapes.add(new Triangle());
for (Shape shape : shapes) {
drawShape(shape);
}
ໃນການເລີ່ມເຮັດວຽກຂອງໂປຣແກຣມ ເຮົາໄດ້ສ້າງ ArrayList ໂດຍການໃຊ້ຄາດ Shape ເປັນ instance ຂອງອອບເຈັກ ດັ່ງນັ້ນເຮົາຈຶ່ງສາມາດນຳໄປສ້າງອອບເຈັກທີ່ສືບຕອດຈາກຄາດນີ້ໄດ້ ນັ້ນກໍ່ຄືເຮົາໄດ້ສ້າງອອບເຈັກຈາກຄາດ Rectangle ແລະ Triangle ແລະ ເກັບໃນ ArrayList ດັ່ງນັ້ນ ຕົວແປຣ shapes ສາມາດມີໄດ້ຫຼາຍຮູບແບບຂອງອອບເຈັກທີ່ສືບຕອດຈາດຄາດ Shape ເຊິ່ງນີ້ເອງຖືເປັນແນວຄິດຂອງການໃຊ້ງານ Polymorphism
public static void drawShape(Shape shape) {
shape.draw();
}
ນອກຈາກນີ້ ເມຕອດ drawShape() ເປັນເມຕອດສຳລັບກາຣແຕ້ມຮູບຊົງທີ່ມີພາຣາມິເຕີເປັນ Shape ດັ່ງນັ້ນເຮົາບໍ່ຕ້ອງສົນໃຈວ່າອອບເຈັກທີ່ສົ່ງເຂົ້າມາຈະເປັນອອບເຈັກຂອງ Rectangle ຫລື Triangle ເຊິ່ງເຮົາສົນໃຈແຕ່ສິ່ງທີ່ເຮົາຕ້ອງການເຮັດຄືການຮຽກໃຊ້ງານເມຕອດ draw() ເຊິ່ງກົນໄກຂອງ Polymorphism ຈະຮຽກໃຊ້ງານເມຕອດຂອງອອບເຈັກອັດຕະໂນມັດ
Draw rectangle
Perform draw from base class
Draw triangle
Perform draw from base class
Draw circle
Perform draw from base class
ນີ້ແມ່ນຜົນມາຈາກໂຄງການທີ່ໃຊ້ Polymorphism ກັບ arrays ແລະ Method.