สำหรับการเขียนโปรแกรมเชิงวัตถุ Abstraction เป็นหนึ่งในคุณสมบัติที่สำคัญ ใน Java, OOP Abstraction สามารถสะท้อนได้ในสองรูปแบบ: อินเทอร์เฟซและคลาสนามธรรม มีความคล้ายคลึงกันมากเกินไปและความแตกต่างมากเกินไประหว่างทั้งสอง หลายคนคิดว่าพวกเขาสามารถใช้แทนกันได้เมื่อพวกเขาเป็นผู้เริ่มต้น แต่ในความเป็นจริงพวกเขาไม่ได้ วันนี้เราจะเรียนรู้เกี่ยวกับอินเทอร์เฟซและคลาสนามธรรมใน Java นี่คือโครงร่างไดเรกทอรีของบทความนี้:
1. คลาสบทคัดย่อ
2. อินเทอร์เฟซ
3. ความแตกต่างระหว่างคลาสนามธรรมและอินเทอร์เฟซ
1. คลาสบทคัดย่อ
ก่อนที่จะเข้าใจคลาสนามธรรมก่อนอื่นให้เข้าใจวิธีการนามธรรม วิธีนามธรรมเป็นวิธีพิเศษ: มีเพียงการประกาศ แต่ไม่มีการใช้งานที่เป็นรูปธรรม รูปแบบการประกาศของวิธีนามธรรมคือ:
บทคัดย่อความสนุก ();
วิธีการนามธรรมจะต้องได้รับการแก้ไขด้วยคำหลักนามธรรม หากคลาสมีวิธีการนามธรรมคลาสนี้เรียกว่าคลาสนามธรรม คลาสนามธรรมจะต้องได้รับการแก้ไขด้วยคำหลักนามธรรมก่อนคลาส เนื่องจากคลาสนามธรรมมีวิธีการที่ไม่มีการใช้งานที่เป็นรูปธรรมวัตถุจึงไม่สามารถสร้างได้โดยใช้คลาสนามธรรม
ปัญหาหนึ่งควรสังเกตด้านล่าง: ในหนังสือ "Java Programming Thought" คลาสนามธรรมจะถูกกำหนดเป็น "คลาสที่มีวิธีการนามธรรม" แต่ต่อมาก็พบว่าหากคลาสไม่มีวิธีนามธรรมและได้รับการแก้ไขด้วยนามธรรม กล่าวอีกนัยหนึ่งคลาสนามธรรมไม่จำเป็นต้องมีวิธีนามธรรม โดยส่วนตัวแล้วฉันคิดว่านี่เป็นคำถามที่ดื้อรั้นเพราะถ้าคลาสนามธรรมไม่มีวิธีการที่เป็นนามธรรมทำไมมันควรได้รับการออกแบบให้เป็นคลาสนามธรรม? ดังนั้นโปรดจำไว้ว่าแนวคิดนี้ในขณะนี้และไม่จำเป็นต้องขุดลงไปว่าทำไม
[สาธารณะ] คลาสนามธรรมคลาสชื่อ {บทคัดย่อโมฆะ fun ();}จากนี้เราจะเห็นว่าคลาสนามธรรมมีอยู่สำหรับการสืบทอด หากคุณกำหนดคลาสนามธรรม แต่ไม่ได้รับมรดกมันจะเทียบเท่ากับการสร้างคลาสนามธรรมนี้อย่างไร้ประโยชน์เพราะคุณไม่สามารถใช้มันเพื่อทำอะไรได้ สำหรับคลาสหลักหากวิธีการใดวิธีหนึ่งของมันถูกนำไปใช้ในคลาสหลักไม่มีความหมายและจะต้องดำเนินการแตกต่างกันตามความต้องการที่แท้จริงของคลาสย่อยแล้ววิธีนี้สามารถประกาศเป็นวิธีนามธรรมและคลาสนี้กลายเป็นคลาสนามธรรม
คลาสที่มีวิธีการนามธรรมเรียกว่าคลาสนามธรรม แต่พวกเขาไม่ได้หมายความว่าวิธีนามธรรมสามารถพบได้ในคลาสนามธรรมเท่านั้น เช่นเดียวกับคลาสธรรมดาพวกเขายังสามารถมีตัวแปรสมาชิกและวิธีการสมาชิกสามัญ โปรดทราบว่ามีความแตกต่างหลักสามประการระหว่างคลาสนามธรรมและคลาสทั่วไป:
1) วิธีนามธรรมจะต้องเป็นสาธารณะหรือได้รับการปกป้อง (เพราะถ้าเป็นส่วนตัวมันไม่สามารถสืบทอดได้โดยคลาสย่อยและคลาสย่อยไม่สามารถใช้วิธีการ) โดยค่าเริ่มต้นมันเป็นสาธารณะ
2) คลาสนามธรรมไม่สามารถใช้เพื่อสร้างวัตถุได้
3) หากคลาสที่สืบทอดมาจากคลาสนามธรรมคลาสย่อยจะต้องใช้วิธีนามธรรมของคลาสแม่ หาก subclass ไม่ได้ใช้วิธีนามธรรมของคลาสพาเรนต์คลาสย่อยจะต้องถูกกำหนดเป็นคลาสนามธรรม
ในด้านอื่น ๆ ไม่มีความแตกต่างระหว่างคลาสนามธรรมและคลาสสามัญ
2. อินเทอร์เฟซ
อินเทอร์เฟซเรียกว่าอินเทอร์เฟซเป็นภาษาอังกฤษในวิศวกรรมซอฟต์แวร์อินเตอร์เฟสโดยทั่วไปอ้างถึงวิธีการหรือฟังก์ชั่นสำหรับผู้อื่นที่จะโทร จากนี้เราสามารถเข้าใจความตั้งใจดั้งเดิมของนักออกแบบภาษา Java ซึ่งเป็นนามธรรมของพฤติกรรม ใน Java รูปแบบของอินเทอร์เฟซมีดังนี้:
[สาธารณะ] อินเตอร์เฟส interfacename {}
อินเตอร์เฟสสามารถมีตัวแปรและวิธีการ อย่างไรก็ตามควรสังเกตว่าตัวแปรในอินเทอร์เฟซจะถูกระบุโดยปริยายว่าเป็นตัวแปรสุดท้ายคงที่สาธารณะ (และสามารถเป็นตัวแปรสุดท้ายคงที่สาธารณะเท่านั้นและการปรับเปลี่ยนส่วนตัวจะรายงานข้อผิดพลาดในการรวบรวม) ในขณะที่วิธีการจะระบุวิธีการที่เป็นนามธรรมสาธารณะ การใช้งานนั่นคือวิธีการในอินเทอร์เฟซจะต้องเป็นวิธีนามธรรม จากที่นี่เราสามารถเห็นความแตกต่างระหว่างอินเทอร์เฟซและคลาสนามธรรม อินเทอร์เฟซเป็นประเภทนามธรรมมาก มันเป็น "นามธรรม" มากกว่าคลาสนามธรรมและโดยทั่วไปจะไม่กำหนดตัวแปรในอินเทอร์เฟซ
ในการสร้างคลาสให้เป็นไปตามกลุ่มของอินเทอร์เฟซคุณต้องใช้คำหลักในการดำเนินการรูปแบบเฉพาะมีดังนี้:
Class ClassName ใช้อินเทอร์เฟซ 1, อินเทอร์เฟซ 2, [.... ] {}
จะเห็นได้ว่าคลาสได้รับอนุญาตให้ติดตามอินเทอร์เฟซที่เฉพาะเจาะจงหลายรายการ หากคลาสที่ไม่ได้เป็นไปตามอินเทอร์เฟซวิธีการทั้งหมดในอินเทอร์เฟซนั้นจะต้องดำเนินการ สำหรับคลาสนามธรรมที่ติดตามอินเทอร์เฟซวิธีการนามธรรมในอินเทอร์เฟซนั้นอาจไม่สามารถนำไปใช้ได้
3. ความแตกต่างระหว่างคลาสนามธรรมและอินเทอร์เฟซ
1. ความแตกต่างในระดับไวยากรณ์
1) คลาสบทคัดย่อสามารถให้รายละเอียดการใช้งานของวิธีการสมาชิกในขณะที่วิธีการนามธรรมสาธารณะเท่านั้นที่สามารถมีอยู่ในอินเทอร์เฟซ
2) ตัวแปรสมาชิกในคลาสนามธรรมอาจเป็นประเภทต่าง ๆ ในขณะที่ตัวแปรสมาชิกในอินเทอร์เฟซสามารถเป็นแบบคงที่สาธารณะได้เท่านั้น
3) อินเตอร์เฟสไม่สามารถมีบล็อกรหัสสแตติกและวิธีการคงที่ในขณะที่คลาสนามธรรมสามารถมีบล็อกรหัสสแตติกและวิธีการคงที่;
4) คลาสสามารถสืบทอดคลาสนามธรรมหนึ่งคลาสเท่านั้นในขณะที่คลาสสามารถใช้หลายอินเทอร์เฟซ
2. ความแตกต่างในระดับการออกแบบ
1) คลาสนามธรรมเป็นนามธรรมของสิ่งต่าง ๆ นั่นคือนามธรรมของคลาสในขณะที่อินเทอร์เฟซเป็นนามธรรมของพฤติกรรม คลาสนามธรรมสรุปทั้งคลาสรวมถึงคุณสมบัติและพฤติกรรม แต่อินเทอร์เฟซนามธรรมส่วนคลาส (พฤติกรรม) เพื่อให้ตัวอย่างง่ายๆเครื่องบินและนกเป็นสิ่งที่แตกต่างกัน แต่พวกเขาทั้งหมดมีสิ่งหนึ่งที่เหมือนกันนั่นคือพวกมันทั้งหมดบิน จากนั้นเมื่อออกแบบเครื่องบินสามารถออกแบบเป็นเครื่องบินและตัวละครเหมือนนก แต่ลักษณะการบินไม่สามารถออกแบบเป็นชั้นเรียนได้ ดังนั้นจึงเป็นเพียงลักษณะพฤติกรรมไม่ใช่คำอธิบายที่เป็นนามธรรมของประเภทของสิ่งต่างๆ ในเวลานี้เที่ยวบินสามารถออกแบบเป็นแมลงวันอินเทอร์เฟซรวมถึงวิธีการบิน () จากนั้นเครื่องบินและนกใช้อินเทอร์เฟซบินตามความต้องการของพวกเขาเอง จากนั้นสำหรับเครื่องบินประเภทต่าง ๆ เช่นเครื่องบินขับไล่เครื่องบินรบเครื่องบินพลเรือน ฯลฯ มันสามารถสืบทอดเครื่องบินโดยตรง นอกจากนี้ยังคล้ายกับนก นกชนิดต่าง ๆ สามารถสืบทอดชนชั้นนกได้โดยตรง จากที่นี่เราจะเห็นได้ว่าการสืบทอดเป็นความสัมพันธ์ "ใช่หรือไม่" ในขณะที่การใช้งานอินเทอร์เฟซเป็นความสัมพันธ์ "ใช่หรือไม่" หากคลาสสืบทอดคลาสนามธรรมคลาสย่อยจะต้องเป็นประเภทของคลาสนามธรรมและการใช้งานอินเตอร์เฟสเป็นความสัมพันธ์ที่ไม่มีอยู่เช่นว่านกสามารถบินได้ (หรือว่ามันมีลักษณะของการบิน) ถ้ามันสามารถบินได้ก็สามารถตระหนักถึงอินเทอร์เฟซนี้ หากไม่สามารถบินได้ก็จะไม่ตระหนักถึงอินเทอร์เฟซนี้
2) ระดับการออกแบบที่แตกต่างกันคลาสนามธรรมคือการออกแบบเทมเพลตเป็นคลาสหลักของคลาสย่อยมากมาย และอินเทอร์เฟซเป็นรหัสของพฤติกรรมมันเป็นการออกแบบรังสี การออกแบบเทมเพลตคืออะไร? ตัวอย่างที่ง่ายที่สุดคือทุกคนใช้เทมเพลตใน PPT หากคุณใช้เทมเพลต A เพื่อออกแบบ PPT B และ PPT C ส่วนร่วมของ PPT B และ PPT C คือเทมเพลต A หากจำเป็นต้องเปลี่ยนส่วนสาธารณะของพวกเขาคุณจะต้องเปลี่ยนเทมเพลต A และไม่จำเป็นต้องเปลี่ยน PPT B และ PPT C Radiant กล่าวคือสำหรับคลาสนามธรรมหากคุณต้องการเพิ่มวิธีการใหม่คุณสามารถเพิ่มการใช้งานเฉพาะในคลาสนามธรรมและคลาสย่อยไม่สามารถเปลี่ยนแปลงได้ แต่สำหรับอินเทอร์เฟซมันเป็นไปไม่ได้ หากอินเทอร์เฟซมีการเปลี่ยนแปลงคลาสทั้งหมดที่ใช้อินเทอร์เฟซนี้จะต้องมีการเปลี่ยนแปลงตามลำดับ
มาดูตัวอย่างที่แพร่กระจายอย่างกว้างขวางที่สุดบนอินเทอร์เน็ต: ตัวอย่างของประตูและสัญญาณเตือน: ประตูมีสองการกระทำ: เปิด () และปิด () ในเวลานี้เราสามารถกำหนดแนวคิดนามธรรมนี้ผ่านคลาสนามธรรมและอินเทอร์เฟซ:
ประตูนามธรรมชั้นเรียน {โมฆะนามธรรมสาธารณะเปิด (); บทคัดย่อสาธารณะเป็นโมฆะปิด ();}หรือ:
ประตูอินเตอร์เฟส {โมฆะนามธรรมสาธารณะเปิด (); บทคัดย่อสาธารณะเป็นโมฆะปิด ();}แต่ตอนนี้ถ้าเราต้องการประตูเพื่อให้มีฟังก์ชั่นการเตือนภัย () แล้วจะใช้งานได้อย่างไร? มีแนวคิดสองประการต่อไปนี้:
1) ใส่ฟังก์ชั่นทั้งสามในคลาสนามธรรม แต่ด้วยวิธีนี้คลาสย่อยทั้งหมดที่สืบทอดมาจากคลาสนามธรรมนี้มีฟังก์ชั่นการเตือนภัย แต่บางประตูไม่จำเป็นต้องมีฟังก์ชั่นการเตือนภัย
2) ใส่ฟังก์ชั่นทั้งสามนี้ไว้ในอินเทอร์เฟซ คลาสที่ต้องใช้ฟังก์ชั่นการเตือนต้องใช้ Open () และปิด () ในอินเทอร์เฟซนี้ บางทีคลาสนี้ไม่มีฟังก์ชั่นทั้งสองของ Open () และปิด () เลยเช่นสัญญาณเตือนไฟไหม้
จากที่นี่เราจะเห็นว่าประตูเปิด (), ปิด () และการเตือนภัย () เป็นเพียงสองพฤติกรรมในหมวดหมู่ที่แตกต่างกัน Open () และ Close () เป็นของลักษณะพฤติกรรมโดยธรรมชาติของประตูตัวเองในขณะที่การเตือนภัย () เป็นของพฤติกรรมเพิ่มเติม ดังนั้นทางออกที่ดีที่สุดคือการออกแบบสัญญาณเตือนเป็นอินเทอร์เฟซรวมถึงพฤติกรรมการเตือนภัย () และประตูเป็นคลาสนามธรรมแยกต่างหากรวมถึงพฤติกรรมที่เปิดและปิด ประตูเตือนภัยอื่นได้รับการออกแบบมาเพื่อสืบทอดชั้นประตูและใช้อินเทอร์เฟซเตือนภัย
อินเตอร์เฟส alram {void arming ();} ประตูนามธรรมชั้นเรียน {void open (); เป็นโมฆะปิด ();} คลาส AlarmDoor ขยายประตูใช้งานการเตือน {void oepn () {// .. } void close () {// .. } void Alarm () {// ... }}ข้างต้นเป็นการรวบรวมอินเทอร์เฟซ Java และคลาสนามธรรม ฉันหวังว่ามันจะช่วยเพื่อนที่เรียนรู้การเขียนโปรแกรม Java