อินเทอร์เฟซสามารถใช้เพื่อกำหนดพฤติกรรมของสัญญาและยังสามารถทำหน้าที่เป็นสัญญาระหว่างสองระบบเพื่อโต้ตอบในขณะที่คลาสนามธรรมส่วนใหญ่จะใช้เพื่อกำหนดพฤติกรรมเริ่มต้นสำหรับคลาสย่อย หมายความว่าคลาสย่อยทั้งหมดควรทำหน้าที่เดียวกัน
เมื่อใดควรใช้คลาสนามธรรม
- คลาสนามธรรมเป็นทางเลือกที่ดีหากเราใช้แนวคิดการสืบทอด เนื่องจากมีการนำคลาสพื้นฐานทั่วไปไปใช้งานกับคลาสที่ได้รับ
- คลาสนามธรรมก็ดีเช่นกัน หากเราต้องการประกาศสมาชิกที่ไม่เปิดเผยต่อสาธารณะ ในอินเทอร์เฟซ วิธีการทั้งหมดต้องเป็นแบบสาธารณะ
- หากเราต้องการเพิ่มเมธอดใหม่ในอนาคต คลาสนามธรรมก็เป็นทางเลือกที่ดีกว่า เพราะหากเราเพิ่มเมธอดใหม่ให้กับอินเทอร์เฟซ คลาสทั้งหมดที่ใช้อินเทอร์เฟซนั้นจะต้องเปลี่ยนเพื่อใช้เมธอดใหม่
- ถ้าเราต้องการสร้างหลายเวอร์ชันของคอมโพเนนต์ของเรา ให้สร้างคลาสนามธรรม คลาสนามธรรมเป็นวิธีที่ง่ายและสะดวกในการกำหนดเวอร์ชันคอมโพเนนต์ของเรา โดยการอัปเดตคลาสพื้นฐาน คลาสที่สืบทอดทั้งหมดจะได้รับการอัปเดตโดยอัตโนมัติพร้อมกับการเปลี่ยนแปลง ในทางกลับกัน อินเทอร์เฟซไม่สามารถเปลี่ยนแปลงได้เมื่อสร้างแล้ว หากจำเป็นต้องใช้อินเทอร์เฟซเวอร์ชันใหม่ เราต้องสร้างอินเทอร์เฟซใหม่ทั้งหมด
- คลาสนามธรรมมีข้อได้เปรียบในการช่วยให้ส่งต่อกันได้ดีกว่า เมื่อลูกค้าใช้อินเทอร์เฟซแล้ว เราไม่สามารถเปลี่ยนแปลงได้ หากพวกเขาใช้คลาสนามธรรม เราก็สามารถเพิ่มพฤติกรรมได้โดยไม่ทำลายโค้ดที่มีอยู่
- หากเราต้องการให้ฟังก์ชันการใช้งานทั่วไปที่นำไปใช้งานในส่วนประกอบทั้งหมดของเรา ให้ใช้คลาสนามธรรม คลาสนามธรรมช่วยให้เราสามารถปรับใช้คลาสของเราได้บางส่วน ในขณะที่อินเทอร์เฟซไม่มีการนำไปใช้สำหรับสมาชิกใดๆ
ตัวอย่าง
abstract class Car { public void accelerate() { System.out.println("Do something to accelerate"); } public void applyBrakes() { System.out.println("Do something to apply brakes"); } public abstract void changeGears(); }
ตอนนี้ รถยนต์ทุกคันที่ต้องการสร้างอินสแตนซ์จะต้องใช้เมธอด changeGears ()
class Alto extends Car { public void changeGears() { System.out.println("Implement changeGears() method for Alto Car"); } } class Santro extends Car { public void changeGears() { System.out.println("Implement changeGears() method for Santro Car"); } }
ควรใช้อินเทอร์เฟซเมื่อใด
- หากฟังก์ชันที่เรากำลังสร้างจะมีประโยชน์กับออบเจ็กต์ที่แตกต่างกันมากมาย ให้ใช้อินเทอร์เฟซ คลาสนามธรรมควรใช้สำหรับอ็อบเจ็กต์ที่มีความเกี่ยวข้องอย่างใกล้ชิดเป็นหลัก ในขณะที่อินเทอร์เฟซเหมาะที่สุดสำหรับการจัดเตรียมฟังก์ชันทั่วไปให้กับคลาสที่ไม่เกี่ยวข้อง
- อินเทอร์เฟซเป็นตัวเลือกที่ดีเมื่อเราคิดว่า API จะไม่เปลี่ยนแปลงชั่วขณะหนึ่ง
- อินเทอร์เฟซก็ดีเช่นกันเมื่อเราต้องการมีสิ่งที่คล้ายกันกับการสืบทอดหลายรายการ เนื่องจากเราสามารถใช้อินเทอร์เฟซหลายตัวได้
- หากเรากำลังออกแบบส่วนเล็กๆ ของการทำงานที่กระชับ ให้ใช้อินเทอร์เฟซ หากเรากำลังออกแบบหน่วยการทำงานขนาดใหญ่ ให้ใช้คลาสนามธรรม
ตัวอย่าง
public interface Actor { void perform(); } public interface Producer { void invest(); }
ทุกวันนี้นักแสดงส่วนใหญ่รวยพอที่จะสร้างหนังของตัวเองได้ หากเราใช้อินเทอร์เฟซมากกว่าคลาสนามธรรม เราสามารถใช้ทั้งนักแสดงและผู้ผลิต นอกจากนี้เรายังสามารถกำหนดอินเทอร์เฟซ ActorProducer ใหม่ที่ขยายทั้งสองได้
public interface ActorProducer extends Actor, Producer{ // some statements }