JavaRush /จาวาบล็อก /Random-TH /การฝึกใช้ความหลากหลาย

การฝึกใช้ความหลากหลาย

เผยแพร่ในกลุ่ม
สวัสดี! วัน นี้เราจะจบชุดการบรรยายเกี่ยวกับหลักการของOOP ในบทนี้เราจะพูดถึงเรื่องความหลากหลาย การฝึกใช้ความหลากหลาย - 1Polymorphism คือความสามารถในการปฏิบัติต่อหลายประเภทราวกับว่าเป็นประเภทเดียวกัน ในกรณีนี้ ลักษณะการทำงานของออบเจ็กต์จะแตกต่างกันขึ้นอยู่กับประเภทของวัตถุ ลองดูที่คำสั่งนี้ในรายละเอียดเพิ่มเติม มาเริ่มกันที่ส่วนแรกกันก่อน: "ความสามารถในการทำงานกับหลายประเภทราวกับว่าเป็นประเภทเดียวกัน" ประเภทต่างๆ จะเป็นหนึ่งเดียวกันได้อย่างไร? ฟังดูแปลกๆ นิดหน่อย :/ จริงๆ แล้วมันก็ง่ายนะ ตัวอย่างเช่น สถานการณ์นี้เกิดขึ้นกับการใช้มรดกตามปกติ มาดูกันว่ามันทำงานอย่างไร สมมติว่าเรามีคลาสพาเรนต์ธรรมดา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 สายพันธุ์ ลองนึกภาพว่าจะเกิดอะไรขึ้นถ้าเราเพิ่มคลาสแยกสำหรับแมวพัลลาส เสือจากัวร์ เมนคูน แมวบ้าน และคนอื่นๆ ลงในโปรแกรม การฝึกใช้ความหลากหลาย - 2แน่นอนว่าตัวโปรแกรมเองจะใช้งานได้ แต่ชั้นเรียนAibolitจะต้องเพิ่มวิธีการใหม่ ๆ ในการรักษาแมวแต่ละประเภทอย่างต่อเนื่อง และผลที่ตามมาก็คือมันจะขยายไปสู่ขนาดที่ไม่เคยมีมาก่อน นี่คือที่มาของคุณสมบัติของความหลากหลาย - "ความสามารถในการทำงานกับหลายประเภทราวกับว่ามันเป็นประเภทเดียวกัน" เราไม่จำเป็นต้องสร้างวิธีการนับไม่ถ้วนที่จะทำสิ่งเดียวกัน นั่นก็คือการรักษาแมว วิธีหนึ่งจะเพียงพอสำหรับทุกกรณีในคราวเดียว:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
   }
}
healCat()เราสามารถส่งผ่านทั้ง object LionและTigerobject ไปยังเมธอดได้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 จำได้ดีว่าแมวเหล่านี้ไม่ใช่แค่แมวสามตัวเท่านั้น แต่ยังรวมถึงสิงโต เสือ และเสือชีตาห์ซึ่งมีการวิ่งที่แตกต่างกัน นี่คือข้อได้เปรียบหลักของการใช้ความหลากหลาย-ความยืดหยุ่น เมื่อเราต้องการสร้างฟังก์ชันบางอย่างที่เหมือนกันในหลายประเภท สิงโต เสือ และชีตาห์ก็จะกลายเป็น "แมว" สัตว์ทุกชนิดมีความแตกต่างกัน แต่ในบางสถานการณ์ แมวก็คือแมว ไม่ว่าจะเป็นสายพันธุ์ใดก็ตาม :) นี่คือวิดีโอยืนยันสำหรับคุณ
เมื่อไม่จำเป็นต้องมี "ลักษณะทั่วไป" นี้ และในทางกลับกัน เราต้องการให้พฤติกรรมของสายพันธุ์แตกต่างกัน แต่ละประเภทก็มีพฤติกรรมที่แตกต่างกัน ด้วยความหลากหลาย คุณจึงสร้างอินเทอร์เฟซเดียว (ชุดวิธีการ) สำหรับคลาสที่หลากหลาย ด้วยเหตุนี้ความซับซ้อนของโปรแกรมจึงลดลง แม้ว่าเราจะขยายโปรแกรมเป็นแมว 40 ประเภท เราก็ยังคงมีอินเทอร์เฟซที่ง่ายที่สุดที่เป็นไปได้ - วิธีเดียวrun()สำหรับแมวทั้ง 40 ตัว
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION