อินเทอร์เฟซเป็นสัญญา (ข้อตกลง) สาธารณะที่ยอมรับโดยทั่วไปซึ่งอธิบายพฤติกรรมบางอย่าง พวกเขาต้องการอะไร? ตัวอย่างเช่น สมมติว่าเรามีลิงก์ที่ชี้ไปยังรายการสตริง สมมติว่ามีการเพิ่มองค์ประกอบหลายอย่างลงในรายการนี้ตั้งแต่ต้น จากนั้นรายการทั้งหมดจะได้รับการประมวลผลเพียงครั้งเดียว สมมติว่าเราตัดสินใจทำตามคำแนะนำที่รู้จักกันดีและใช้คลาส
ArrayList
:
ArrayList<String> list = new ArrayList<>();
เราเขียนพฤติกรรมของโปรแกรมด้วยโค้ด 100,500 บรรทัดที่ใช้รายการสตริงนี้ และใช้วิธีการเฉพาะคลาสเพื่อเพิ่มประสิทธิภาพการArrayList
ทำงาน ตัวอย่างเช่นmakesureCapacity( ) ตราบใดที่มีการเพิ่มบรรทัดต่อท้ายรายการ ทุกอย่างก็ทำงานได้ดีและรวดเร็ว แต่ตอนนี้เราจำเป็นต้องปรับทิศทางโปรแกรมของเราใหม่ให้เป็นงานประเภทอื่นเล็กน้อย โดยที่บรรทัดจะถูกเพิ่มไว้ที่จุดเริ่มต้นของรายการเป็นหลัก สำหรับการโหลดประเภทนี้จะเหมาะสมกว่าLinkedList
มาก แต่หากเราต้องการแปลโปรแกรมของเราที่มีโค้ดจำนวน 100,500 บรรทัดไปไว้บน Rails LinkedList
เราจะต้องค้นหาและลบการใช้ArrayList
วิธีการเฉพาะออกไป บางทีในบางสถานที่อาจเปลี่ยนแปลงตรรกะของแต่ละส่วนของโปรแกรมไปอย่างมาก หากเราใช้เฉพาะวิธีการที่มีอยู่ในทั้งArrayList
และในLinkedList
เราก็ไม่จำเป็นต้องทำเช่นนี้ เราสามารถเปลี่ยนโค้ดได้หนึ่งบรรทัด - การประกาศรายการ:
LinkedList<String> list = new LinkedList<>();
เราจะสังเกตได้ว่ามันจะสะดวกกว่าถ้าจะประกาศวิธีการทั่วไปสำหรับคลาสเหล่านี้ในคลาสบรรพบุรุษ อาจเป็นนามธรรมAbstractList
เป็นต้น ในกรณีนี้ เราสามารถประกาศรายการของเราได้ดังนี้:
AbstractList<String> list = new ArrayList<>();
และเราสามารถเปลี่ยนการใช้งานได้อย่างรวดเร็วดังนี้:
AbstractList<String> list = new LinkedList<>();
แต่ในกรณีนี้ คลาสที่เราสามารถใช้ในโปรแกรมของเรานั้นถูกจำกัดไว้เฉพาะลูกหลานของคลาสAbstractList
แม้ว่าจะมีคลาสที่เหมาะสมกว่าซึ่งไม่ใช่ลูกหลานของคลาสAbstractList
แต่มีวิธีการเดียวกันและมีพฤติกรรมเหมือนกัน ฉันควรทำอย่างไรดี? นี่คือสาเหตุว่าทำไม อินเทอร์เฟซจึงถูกคิดค้นขึ้น อินเทอร์เฟซเป็นแบบแผนเกี่ยวกับชุดของวิธีการและพฤติกรรมของวิธีการเหล่านั้นที่คลาสที่ไม่เกี่ยวข้องโดยสิ้นเชิงสามารถกระทำได้ โดยอนุญาตให้วิธีใดวิธีหนึ่งสามารถอ้างอิงได้ด้วยการอ้างอิงเดียว ตัวอย่างเช่น:
List<String> list;
list = new ArrayList<>();
list = new LinkedList<>();
list = new AnotherListClass<>();
แม้ว่าAnotherListClass
คลาสจะไม่มีคลาสบรรพบุรุษ ร่วม ArrayList
กัน ยกเว้น. ตัวอย่างที่ดีของอินเทอร์เฟซคือการบังคับเลี้ยวของรถยนต์ - รถมีพวงมาลัย คันเหยียบ และกระปุกเกียร์ ในรถยนต์ส่วนใหญ่ องค์ประกอบเหล่านี้เป็นไปตามรูปแบบพฤติกรรมเดียวกัน ตัวอย่างเช่น หากคุณหมุนพวงมาลัยทวนเข็มนาฬิกา รถจะเลี้ยวซ้ายแทนที่จะเร่งความเร็วโดยไม่คำนึงถึงยี่ห้อ หากคุณรู้วิธีใช้การควบคุมเหล่านี้ คุณสามารถควบคุมรถทุกคันได้อย่างง่ายดาย โดยไม่คำนึงถึงรุ่น ปี ยี่ห้อ หรือประเภทเครื่องยนต์ ยิ่งไปกว่านั้น เราสามารถจินตนาการถึงสถานการณ์ที่การขนส่งประเภทต่าง ๆ โดยสิ้นเชิง (เช่น ยานอวกาศ) มีอินเทอร์เฟซการควบคุมเหมือนกับรถยนต์ หากคุณรู้วิธีขับรถและพบว่าตัวเองอยู่ในที่นั่งนักบินของเรือลำนี้ คุณจะสามารถหลีกเลี่ยงการหลงทางในสถานการณ์นี้ได้ ทำซ้ำอีกครั้ง:LinkedList
Object
- อินเทอร์เฟซคือสัญญา (ข้อตกลง) เกี่ยวกับพฤติกรรม
- คลาสจำนวนมาก แม้แต่คลาสที่ไม่เกี่ยวข้องกับการสืบทอดก็สามารถประกาศว่าคลาสเหล่านั้นตกลงที่จะปฏิบัติตามสัญญานี้ (การใช้งานอินเทอร์เฟซ)
- การวางคำอธิบายพฤติกรรมในอินเทอร์เฟซแยกต่างหากนั้นสะดวกมาก เนื่องจากจะเพิ่มความยืดหยุ่นของโค้ด ทำให้คุณสามารถสลับการใช้งาน (คลาสที่ใช้อินเทอร์เฟซ) ของอินเทอร์เฟซเป็นคลาสที่ไม่เกี่ยวข้องกับการสืบทอด
GO TO FULL VERSION