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

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


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

public class A extends B{
}

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

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

มรดกหลายอย่าง:

การสืบทอดมีหลายประเภท ได้แก่ เดี่ยว หลายระดับ ลำดับชั้น หลายรายการ และแบบผสม

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

ปัญหาเพชร

ตัวอย่างเช่น สมมติว่า Java รองรับการสืบทอดหลายรายการ ด้วยสมมติฐานดังกล่าว ให้พิจารณาตัวอย่างต่อไปนี้

ตัวอย่าง

ที่นี่ เรามีคลาสนามธรรมชื่อ ตัวอย่าง ด้วยวิธีนามธรรมเป็น −

public class abstract Sample {
   public abstract demo();
}

จากนั้นในแพ็คเกจ/โฟลเดอร์เดียวกัน เรามีสองคลาสที่ขยายคลาสนี้และพยายามใช้วิธีนามธรรม demo()

public class Super1 extends Sample{
   public void demo() {
      System.out.println("demo method of super1");
   }  
}
public class Super2 extends Sample{
   public void demo() {
      System.out.println("demo method of super2");
   }  
}

ตามสมมติฐานของเรา เนื่องจาก Java รองรับการสืบทอดหลายรายการ เราจึงพยายามสืบทอดทั้งคลาส Super1 และ Super2

public class SubClass extends Super1, Super2 {  
   public static void main(String args[]) {
      SubClass obj = new SubClass();
      obj.demo();
   }
}

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

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

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

ข้อผิดพลาดในการคอมไพล์เวลา

ในการคอมไพล์ โปรแกรมข้างต้นสร้างข้อผิดพลาดดังต่อไปนี้ -

MultipleInheritanceExample.java:9: error: '{' expected
public class MultipleInheritanceExample extends MyInterface1, MyInterface2{
                                                            ^
1 error

วิธีแก้ปัญหา

คุณสามารถรับมรดกหลายอย่างใน 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