สวัสดี! วัน นี้เราจะจบชุดการบรรยายเกี่ยวกับหลักการของOOP ในบทนี้เราจะพูดถึงเรื่องความหลากหลาย Polymorphism คือความสามารถในการปฏิบัติต่อหลายประเภทราวกับว่าเป็นประเภทเดียวกัน ในกรณีนี้ ลักษณะการทำงานของออบเจ็กต์จะแตกต่างกันขึ้นอยู่กับประเภทของวัตถุ ลองดูที่คำสั่งนี้ในรายละเอียดเพิ่มเติม มาเริ่มกันที่ส่วนแรกกันก่อน: "ความสามารถในการทำงานกับหลายประเภทราวกับว่าเป็นประเภทเดียวกัน" ประเภทต่างๆ จะเป็นหนึ่งเดียวกันได้อย่างไร? ฟังดูแปลกๆ นิดหน่อย :/ จริงๆ แล้วมันก็ง่ายนะ ตัวอย่างเช่น สถานการณ์นี้เกิดขึ้นกับการใช้มรดกตามปกติ มาดูกันว่ามันทำงานอย่างไร สมมติว่าเรามีคลาสพาเรนต์ธรรมดา
เมื่อไม่จำเป็นต้องมี "ลักษณะทั่วไป" นี้ และในทางกลับกัน เราต้องการให้พฤติกรรมของสายพันธุ์แตกต่างกัน แต่ละประเภทก็มีพฤติกรรมที่แตกต่างกัน ด้วยความหลากหลาย คุณจึงสร้างอินเทอร์เฟซเดียว (ชุดวิธีการ) สำหรับคลาสที่หลากหลาย ด้วยเหตุนี้ความซับซ้อนของโปรแกรมจึงลดลง แม้ว่าเราจะขยายโปรแกรมเป็นแมว 40 ประเภท เราก็ยังคงมีอินเทอร์เฟซที่ง่ายที่สุดที่เป็นไปได้ - วิธีเดียว
Cat
ที่มีเมธอดเดียวrun()
- “run”:
public class Cat {
public void run() {
System.out.println("Бег!");
}
}
ตอนนี้เรามาสร้างคลาสสามคลาสที่สืบทอดมาจากCat
: Lion
และTiger
ซึ่งCheetah
หมายถึงสิงโต เสือ และเสือชีตาห์
public class Lion extends Cat {
@Override
public void run() {
System.out.println("Лев бежит со speedю 80 км/ч");
}
}
public class Tiger extends Cat {
@Override
public void run() {
System.out.println("Тигр бежит со speedю 60 км/ч");
}
}
public class Cheetah extends Cat {
@Override
public void run() {
System.out.println("Гепард бежит со speedю до 120 км/ч");
}
}
ดังนั้นเราจึงมี 3 ชั้นเรียน เรามาจำลองสถานการณ์ที่เราสามารถทำงานร่วมกับพวกเขาได้ราวกับว่าพวกเขาเป็นคลาสเดียวกัน ลองจินตนาการว่าแมวตัวหนึ่งของเราป่วยและต้องการความช่วยเหลือจากดร. ไอโบลิท มาลองสร้างคลาสAibolit
ที่สามารถรักษาสิงโต เสือ และเสือชีตาห์กันดีกว่า
public class Aibolit {
public void healLion(Lion lion) {
System.out.println("Лев здоров!");
}
public void healTiger(Tiger tiger) {
System.out.println("Тигр здоров!");
}
public void healCheetah(Cheetah cheetah) {
System.out.println("Гепард здоров!");
}
}
ดูเหมือนว่าปัญหาจะได้รับการแก้ไขแล้ว - ชั้นเรียนถูกเขียนและพร้อมใช้งานแล้ว แต่ถ้าเราอยากจะขยายโปรแกรมเราจะทำอย่างไร? ขณะนี้มีเพียง 3 สายพันธุ์เท่านั้น ได้แก่ สิงโต เสือ และเสือชีตาห์ แต่ในโลกนี้มีแมวมากกว่า 40 สายพันธุ์ ลองนึกภาพว่าจะเกิดอะไรขึ้นถ้าเราเพิ่มคลาสแยกสำหรับแมวพัลลาส เสือจากัวร์ เมนคูน แมวบ้าน และคนอื่นๆ ลงในโปรแกรม แน่นอนว่าตัวโปรแกรมเองจะใช้งานได้ แต่ชั้นเรียนAibolit
จะต้องเพิ่มวิธีการใหม่ ๆ ในการรักษาแมวแต่ละประเภทอย่างต่อเนื่อง และผลที่ตามมาก็คือมันจะขยายไปสู่ขนาดที่ไม่เคยมีมาก่อน นี่คือที่มาของคุณสมบัติของความหลากหลาย - "ความสามารถในการทำงานกับหลายประเภทราวกับว่ามันเป็นประเภทเดียวกัน" เราไม่จำเป็นต้องสร้างวิธีการนับไม่ถ้วนที่จะทำสิ่งเดียวกัน นั่นก็คือการรักษาแมว วิธีหนึ่งจะเพียงพอสำหรับทุกกรณีในคราวเดียว:
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
}
}
healCat()
เราสามารถส่งผ่านทั้ง object Lion
และTiger
object ไปยังเมธอดได้Cheetah
- พวกมันทั้งหมดCat
:
public class Main {
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
}
เอาต์พุตคอนโซล:
Пациент здоров!
Пациент здоров!
Пациент здоров!
นี่คือวิธีที่ชั้นเรียนของเราАйболит
สามารถทำงานกับประเภทต่างๆ ราวกับว่าเป็นประเภทเดียวกัน ตอนนี้เรามาจัดการกับส่วนที่สองกัน: "ในกรณีนี้ พฤติกรรมของวัตถุจะแตกต่างกันขึ้นอยู่กับประเภทของวัตถุนั้น" ทุกอย่างก็เรียบง่ายที่นี่เช่นกัน โดยธรรมชาติแล้ว แมวทุกตัวมีพฤติกรรมไม่เหมือนกัน ความเร็วในการวิ่งจะแตกต่างกันเป็นอย่างน้อย ในบรรดาสัตว์เลี้ยงสามตัวของเรา เสือชีตาห์วิ่งเร็วที่สุด ในขณะที่เสือและสิงโตวิ่งช้ากว่า นั่นคือพฤติกรรมของพวกเขาแตกต่างกัน ความหลากหลายไม่เพียงแต่ทำให้เราสามารถใช้ประเภทต่างๆ เป็นหนึ่งเดียวได้ ในขณะเดียวกันก็ช่วยให้เราไม่ลืมความแตกต่างของพวกเขาและรักษาพฤติกรรมเฉพาะของแต่ละคนไว้ สิ่งนี้สามารถเข้าใจได้ด้วยตัวอย่างนี้ สมมติว่าหลังจากฟื้นตัวได้สำเร็จ แมวของเราก็ตัดสินใจวิ่งไปรอบๆ เล็กน้อยเพื่อเฉลิมฉลอง มาเพิ่มสิ่งนี้ในชั้นเรียนของเราAibolit
:
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
cat.run();
}
}
เรามาลองรันโค้ดเดียวกันเพื่อรักษาสัตว์สามตัวกัน:
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
และผลลัพธ์จะออกมาเป็นดังนี้:
Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
ที่นี่เราเห็นได้อย่างชัดเจนว่าพฤติกรรมเฉพาะของวัตถุของเราได้รับการเก็บรักษาไว้ แม้ว่าเราจะส่งต่อสัตว์ทั้งสามตัวเป็นวิธีการ "สรุป" แต่ละตัวCat
เป็น ต้องขอบคุณความหลากหลายที่ทำให้ Java จำได้ดีว่าแมวเหล่านี้ไม่ใช่แค่แมวสามตัวเท่านั้น แต่ยังรวมถึงสิงโต เสือ และเสือชีตาห์ซึ่งมีการวิ่งที่แตกต่างกัน นี่คือข้อได้เปรียบหลักของการใช้ความหลากหลาย-ความยืดหยุ่น เมื่อเราต้องการสร้างฟังก์ชันบางอย่างที่เหมือนกันในหลายประเภท สิงโต เสือ และชีตาห์ก็จะกลายเป็น "แมว" สัตว์ทุกชนิดมีความแตกต่างกัน แต่ในบางสถานการณ์ แมวก็คือแมว ไม่ว่าจะเป็นสายพันธุ์ใดก็ตาม :) นี่คือวิดีโอยืนยันสำหรับคุณ
run()
สำหรับแมวทั้ง 40 ตัว
GO TO FULL VERSION