JavaRush /จาวาบล็อก /Random-TH /วิธีการเริ่มต้นในอินเทอร์เฟซ

วิธีการเริ่มต้นในอินเทอร์เฟซ

เผยแพร่ในกลุ่ม
Java เวอร์ชันใหม่แต่ละเวอร์ชันจะแตกต่างจากเวอร์ชันก่อนหน้า นี่คือตัวอย่างการเปลี่ยนแปลงจากเนื้อหาที่เรากล่าวถึง: ก่อน Java 5 ไม่มีenum' ในภาษา
วิธีการเริ่มต้นในอินเทอร์เฟซ - 1
ในทำนองเดียวกัน Java 8 แตกต่างจาก Java 7 อย่างเห็นได้ชัด การบรรยายส่วนใหญ่ของเราเขียนด้วยภาษาเวอร์ชัน 7 แต่แน่นอนว่าเราจะไม่เพิกเฉยต่อนวัตกรรมที่สำคัญ เนื่องจากเรากำลังพูดถึงอินเทอร์เฟซในการบรรยายนี้ เรามาดูการอัปเดตหนึ่งรายการ - วิธีการเริ่มต้นในอินเทอร์เฟซ คุณรู้อยู่แล้วว่าอินเทอร์เฟซไม่ได้ใช้งาน หน้าที่ของมันคือเพื่ออธิบายพฤติกรรมที่วัตถุทั้งหมดที่นำไปใช้ควรมี แต่บ่อยครั้งที่นักพัฒนาต้องเผชิญกับสถานการณ์ที่การนำวิธีการไปปฏิบัติในทุกคลาสเหมือนกัน ลองดูตัวอย่างรถเก่าของเรา:
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
คุณคิดว่าอะไรคือปัญหาหลักของรหัสนี้ คุณอาจสังเกตเห็นว่าเราเขียนโค้ดเดียวกันมากมาย! ปัญหานี้เป็นเรื่องปกติในการเขียนโปรแกรมและควรหลีกเลี่ยง อีกประการหนึ่งคือก่อนการเปิดตัว Java 8 ไม่มีตัวเลือกโซลูชันพิเศษ เมื่อเวอร์ชันนี้เปิดตัว ก็เป็นไปได้ที่จะกำหนดวิธีการเริ่มต้นและนำไปใช้ได้ทันทีภายในอินเทอร์เฟซ! ต่อไปนี้เป็นวิธีดำเนินการ:
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
ขณะนี้วิธีการgas()และbrake()ซึ่งเหมือนกันสำหรับทุกเครื่อง รวมอยู่ในอินเทอร์เฟซแล้ว และไม่จำเป็นต้องใช้โค้ดที่ซ้ำกัน นอกจากนี้ยังมีวิธีการในแต่ละคลาสอีกด้วย!
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
จะเกิดอะไรขึ้นถ้ามี 100 คลาสที่มี method gas()แต่มีเพียง 99 คลาสเท่านั้นที่มีพฤติกรรมเหมือนกัน? สิ่งนี้จะทำลายทุกสิ่ง และวิธีการเริ่มต้นจะใช้ไม่ได้ในกรณีนี้ ไม่แน่นอน :) สามารถแทนที่วิธีการเริ่มต้นของอินเทอร์เฟซได้
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
เครื่องจักรอีก 99 ประเภทอื่นๆ ทั้งหมดจะใช้วิธีเริ่มต้น และคลาสUnusualCar- ข้อยกเว้น - จะไม่ทำให้ภาพรวมเสียและจะกำหนดพฤติกรรมของมันอย่างใจเย็น การสืบทอดหลายรายการในอินเทอร์เฟซ ดังที่คุณทราบแล้วว่า Java ไม่มีการสืบทอดหลายรายการ มีเหตุผลหลายประการ เราจะดูรายละเอียดในการบรรยายแยกกัน ในภาษาอื่นๆ เช่น ในภาษา C++ จะเป็นอีกทางหนึ่ง หากไม่มีมรดกหลายรายการ ปัญหาร้ายแรงก็เกิดขึ้น: วัตถุเดียวกันสามารถมีลักษณะและ "พฤติกรรม" ที่แตกต่างกันได้หลายประการ ตัวอย่างจากชีวิต: สำหรับพ่อแม่เราเป็นเด็ก สำหรับครู เราเป็นนักเรียน สำหรับแพทย์ เราเป็นผู้ป่วย ในชีวิต เราปรากฏตัวในบทบาทที่แตกต่างกันและประพฤติแตกต่างออกไป เห็นได้ชัดว่าเราจะพูดคุยกับครูแตกต่างจากเพื่อนสนิท เรามาลองแปลสถานการณ์นี้เป็นโค้ดกัน ลองจินตนาการว่าเรามีสองชั้นเรียน: Pond และ Aviary สำหรับบ่อน้ำคุณต้องมีนกว่ายน้ำ และสำหรับกรงนกขนาดใหญ่ คุณต้องมีนกบินได้ เพื่อที่จะทำสิ่งนี้ เราได้สร้างคลาสพื้นฐานขึ้นมาสองคลาส - FlyingBirdและWaterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
ดังนั้น เราจะส่งนกเหล่านั้นที่มีคลาสสืบทอดมาจาก ให้กับกรงนกขนาดใหญ่FlyingBirdและไปที่สระน้ำ - บรรดานกที่สืบเชื้อสายมาจากWaterfowl. ทุกอย่างดูเรียบง่าย แต่เราจะทำอย่างไรหากจำเป็นต้องระบุเป็ดที่ไหนสักแห่ง? เธอทั้งว่ายน้ำและบิน แต่เราไม่มีมรดกหลายอัน โชคดีที่ Java มีการใช้งานอินเทอร์เฟซที่หลากหลาย หากคลาสไม่สามารถสืบทอดมาจากพาเรนต์หลายตัว การใช้อินเทอร์เฟซหลายอันก็เป็นเรื่องง่าย! เป็ดของเราเป็นได้ทั้งบินและว่ายน้ำ :) การใช้ อินเทอร์เฟซ FlyingBirdแทนWaterfowlการเรียนเพื่อให้ได้ผลลัพธ์ตามที่ต้องการ ก็เพียงพอแล้ว
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
ด้วยเหตุนี้ โปรแกรมของเราจึงยังคงการจัดการคลาสที่ยืดหยุ่น และเมื่อใช้ร่วมกับวิธีการเริ่มต้น ความสามารถของเราในการกำหนดพฤติกรรมของอ็อบเจ็กต์จึงแทบจะไร้ขีดจำกัด! :)
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION