Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีแก้ปัญหาเพชรโดยใช้วิธีการเริ่มต้นใน Java


มรดก เป็นความสัมพันธ์ระหว่างสองคลาสโดยที่คลาสหนึ่งสืบทอดคุณสมบัติของคลาสอื่น ความสัมพันธ์นี้สามารถกำหนดได้โดยใช้คีย์เวิร์ดขยายเป็น −

public class A extends B{

}

คลาสที่สืบทอดคุณสมบัติเรียกว่าคลาสย่อยหรือคลาสย่อยและคลาสที่มีคุณสมบัติที่สืบทอดมาคือ super class หรือ parent class

ในการสืบทอด สำเนาของสมาชิก super class จะถูกสร้างขึ้นในวัตถุคลาสย่อย ดังนั้น การใช้อ็อบเจ็กต์คลาสย่อย คุณสามารถเข้าถึงสมาชิกของทั้งสองคลาสได้

การสืบทอดหลายรายการเป็นที่ที่คลาสหนึ่งสืบทอดคุณสมบัติของหลายคลาส กล่าวอีกนัยหนึ่ง ในการสืบทอดหลายรายการ เราสามารถมีคลาสลูกหนึ่งคลาสและคลาสพาเรนต์จำนวน n รายการ Java ไม่รองรับการสืบทอดหลายรายการ (พร้อมคลาส)

ปัญหาเพชร

  • ตัวอย่างเช่น สมมติว่า Java รองรับการสืบทอดหลายรายการ
  • และถ้าเรามีคลาสนามธรรมชื่อ Sample ด้วยวิธีการเชิงนามธรรม demo()
  • จากนั้น หากอีกสองคลาสในแพ็คเกจเดียวกันขยายคลาสนี้และพยายามใช้วิธีนามธรรม demo()
  • จากนั้น ตามกฎพื้นฐานของการสืบทอด ควรสร้างสำเนาของทั้งสองวิธี demo() ในออบเจ็กต์คลาสย่อย ซึ่งปล่อยให้คลาสย่อยมีสองเมธอดที่มีต้นแบบเดียวกัน (ชื่อและอาร์กิวเมนต์)
  • จากนั้น หากคุณเรียกใช้เมธอด demo() โดยใช้อ็อบเจ็กต์ของคอมไพเลอร์คลาสย่อย จะเผชิญกับสถานการณ์ที่คลุมเครือโดยไม่รู้ว่าจะเรียกใช้เมธอดใด ปัญหานี้เรียกว่าปัญหาเพชรใน Java วิธีแก้ปัญหาเพชรโดยใช้วิธีการเริ่มต้นใน Java

วิธีแก้ปัญหาเพชร

คุณสามารถรับมรดกหลายอย่างใน Java โดยใช้วิธีการเริ่มต้น (Java8) และอินเทอร์เฟซ

จาก Java8 บนวอร์ด วิธีการเริ่มต้น ถูกนำเสนอในอินเทอร์เฟซ ต่างจากวิธีนามธรรมอื่น ๆ วิธีเหล่านี้เป็นวิธีการของอินเทอร์เฟซที่มีการใช้งานเริ่มต้น หากคุณมีวิธีการเริ่มต้นในอินเทอร์เฟซ ไม่จำเป็นต้องแทนที่ (ระบุเนื้อหา) ในคลาสที่ใช้อินเทอร์เฟซนี้อยู่แล้ว

คุณสามารถมีวิธีการเริ่มต้นที่เหมือนกัน (ชื่อและลายเซ็นเดียวกัน) ในอินเทอร์เฟซสองแบบที่แตกต่างกัน และจากคลาส คุณสามารถใช้อินเทอร์เฟซทั้งสองนี้ได้

หากคุณทำเช่นนั้น คุณต้องแทนที่เมธอดดีฟอลต์จากคลาสโดยระบุเมธอดเริ่มต้นอย่างชัดแจ้งพร้อมกับชื่ออินเตอร์เฟส

ตัวอย่าง

interface MyInterface1{  
   public static int num = 100;
   public default void display() {
      System.out.println("display method of MyInterface1");
   }
}
interface MyInterface2{  
   public static int num = 1000;
   public default void display() {
      System.out.println("display method of MyInterface2");
   }
}  
public class InterfaceExample implements MyInterface1, MyInterface2{
   public void display() {
      MyInterface1.super.display();
      //or,
      MyInterface2.super.display();
   }      
   public static void main(String args[]) {
      InterfaceExample obj = new InterfaceExample();
      obj.display();
   }
}

ผลลัพธ์

display method of MyInterface1
display method of MyInterface2