abstractclass และอินเทอร์เฟซเป็นสองกลไกในภาษา Java ที่รองรับคำจำกัดความของคลาสนามธรรม เนื่องจากการมีอยู่ของกลไกทั้งสองนี้ทำให้ Java ได้รับความสามารถเชิงวัตถุอันทรงพลัง มีความคล้ายคลึงกันอย่างมากระหว่าง abstractclass และอินเทอร์เฟซในแง่ของการรองรับการกำหนดคลาสนามธรรม และยังสามารถแทนที่กันได้ ดังนั้น นักพัฒนาจำนวนมากจึงดูเหมือนจะไม่เป็นทางการเกี่ยวกับการเลือกคลาสนามธรรมและอินเทอร์เฟซเมื่อกำหนดคลาสนามธรรม ในความเป็นจริง ยังคงมีความแตกต่างอย่างมากระหว่างทั้งสอง การเลือกสิ่งเหล่านี้สะท้อนถึงความเข้าใจในธรรมชาติของขอบเขตปัญหา และความเข้าใจในจุดประสงค์การออกแบบนั้นถูกต้องและสมเหตุสมผลหรือไม่ บทความนี้จะวิเคราะห์ความแตกต่างระหว่างพวกเขาและพยายามให้นักพัฒนามีพื้นฐานในการเลือกระหว่างทั้งสอง
ทำความเข้าใจคลาสนามธรรม
ทั้ง Abstractclass และอินเทอร์เฟซใช้เพื่อสร้างคลาสนามธรรมในภาษา Java (คลาสนามธรรมในบทความนี้ไม่ได้แปลจาก abstractclass มันแสดงถึงเนื้อหานามธรรม และ abstractclass เป็นวิธีการที่ใช้ในการกำหนดคลาสนามธรรมในภาษา Java) ผู้อ่าน โปรดใส่ใจในการแยกแยะ) คำจำกัดความ แล้วคลาสนามธรรมคืออะไร และการใช้คลาสนามธรรมมีประโยชน์อะไรบ้าง
ในแนวคิดเชิงวัตถุ เรารู้ว่าวัตถุทั้งหมดแสดงด้วยคลาส แต่สิ่งที่ตรงกันข้ามไม่เป็นความจริง ไม่ใช่ทุกคลาสจะถูกนำมาใช้เพื่ออธิบายวัตถุ หากคลาสไม่มีข้อมูลเพียงพอที่จะอธิบายวัตถุเฉพาะ คลาสดังกล่าวจะเป็นคลาสนามธรรม คลาสนามธรรมมักใช้เพื่อแสดงแนวคิดเชิงนามธรรมที่เราได้รับจากการวิเคราะห์และการออกแบบพื้นที่ที่มีปัญหา เป็นนามธรรมของชุดแนวคิดเฉพาะที่ดูแตกต่างแต่โดยพื้นฐานแล้วมีความเหมือนกัน ตัวอย่างเช่น: หากเราพัฒนาซอฟต์แวร์แก้ไขกราฟิก เราจะพบว่ามีแนวคิดเฉพาะบางอย่าง เช่น วงกลมและสามเหลี่ยมในโดเมนของปัญหา สิ่งเหล่านี้จะแตกต่างกัน แต่ทั้งหมดอยู่ในแนวคิดเรื่องรูปร่างที่แตกต่างกัน ในขอบเขตของปัญหา ถ้ามี ก็เป็นแนวคิดที่เป็นนามธรรม เป็นเพราะแนวคิดนามธรรมไม่มีแนวคิดที่เป็นรูปธรรมที่สอดคล้องกันในขอบเขตของปัญหา ดังนั้นคลาสนามธรรมที่ใช้เพื่อแสดงแนวคิดเชิงนามธรรมจึงไม่สามารถสร้างอินสแตนซ์ได้
ในฟิลด์เชิงวัตถุ คลาสนามธรรมส่วนใหญ่จะใช้สำหรับการซ่อนประเภท เราสามารถสร้างคำอธิบายเชิงนามธรรมของชุดพฤติกรรมที่ตายตัวได้ แต่พฤติกรรมชุดนี้สามารถนำไปประยุกต์ใช้อย่างเป็นรูปธรรมได้จำนวนเท่าใดก็ได้ คำอธิบายนามธรรมนี้เป็นคลาสนามธรรม และชุดของการใช้งานที่เป็นรูปธรรมที่เป็นไปได้นี้จะแสดงด้วยคลาสที่ได้รับที่เป็นไปได้ทั้งหมด โมดูลสามารถทำงานบนเนื้อหาที่เป็นนามธรรมได้ เนื่องจากโมดูลอาศัยนามธรรมคงที่ จึงไม่สามารถแก้ไขได้ ในเวลาเดียวกัน พฤติกรรมของโมดูลนี้สามารถขยายได้โดยการได้รับจากนามธรรมนี้ ผู้อ่านที่คุ้นเคยกับ OCP ต้องรู้ว่าเพื่อที่จะตระหนักถึง OCP (Open-ClosedPrinciple) หนึ่งในหลักการสำคัญของการออกแบบเชิงวัตถุ คลาสนามธรรมคือกุญแจสำคัญ
ดู abstractclass และอินเทอร์เฟซจากระดับคำจำกัดความทางไวยากรณ์
ในระดับไวยากรณ์ ภาษา Java ให้คำจำกัดความที่แตกต่างกันสำหรับคลาสนามธรรมและอินเทอร์เฟซ ต่อไปนี้เป็นตัวอย่างของการกำหนดคลาสนามธรรมที่ชื่อ Demo เพื่อแสดงความแตกต่างนี้
วิธีการกำหนดคลาสนามธรรมสาธิตโดยใช้ abstractclass มีดังต่อไปนี้:
จากมุมมองของการเขียนโปรแกรม ทั้ง abstractclass และอินเทอร์เฟซสามารถใช้เพื่อนำแนวคิดของ "designbycontract" ไปปฏิบัติได้ อย่างไรก็ตาม ยังคงมีความแตกต่างบางประการในการใช้งานเฉพาะ
ประการแรก abstractclass แสดงถึงความสัมพันธ์แบบสืบทอดในภาษา Java และคลาสสามารถใช้ความสัมพันธ์แบบสืบทอดได้เพียงครั้งเดียวเท่านั้น อย่างไรก็ตาม คลาสสามารถใช้หลายอินเทอร์เฟซได้ บางทีนี่อาจเป็นการพิจารณาประนีประนอมโดยนักออกแบบภาษา Java เมื่อพิจารณาถึงการสนับสนุนของ Java สำหรับการสืบทอดหลายรายการ
ประการที่สอง ในคำจำกัดความของ abstractclass เราสามารถกำหนดพฤติกรรมเริ่มต้นของเมธอดได้ แต่ในคำจำกัดความของอินเทอร์เฟซ วิธีการไม่สามารถมีพฤติกรรมเริ่มต้นได้ เพื่อหลีกเลี่ยงข้อจำกัดนี้ ต้องใช้ผู้รับมอบสิทธิ์ แต่จะเพิ่มความซับซ้อนและบางครั้งก็ทำให้เกิดปัญหามากมาย
มีปัญหาร้ายแรงอีกประการหนึ่งที่ไม่สามารถกำหนดพฤติกรรมเริ่มต้นในคลาสนามธรรมได้ ซึ่งก็คืออาจทำให้เกิดปัญหาในการบำรุงรักษาได้ เพราะถ้าคุณต้องการแก้ไขอินเทอร์เฟซของคลาสในภายหลัง (โดยปกติจะแสดงด้วย abstractclass หรืออินเทอร์เฟซ) เพื่อปรับให้เข้ากับสถานการณ์ใหม่ (เช่น เพิ่มวิธีการใหม่หรือเพิ่มพารามิเตอร์ใหม่ให้กับวิธีการที่มีอยู่) มันจะยุ่งยากมากและอาจ ใช้เวลานาน (โดยเฉพาะเมื่อมีคลาสที่ได้รับหลายคลาส) แต่หากอินเทอร์เฟซถูกใช้งานผ่าน abstractclass คุณอาจต้องแก้ไขพฤติกรรมเริ่มต้นที่กำหนดไว้ใน abstractclass เท่านั้น
ในทำนองเดียวกัน หากไม่สามารถกำหนดพฤติกรรมเริ่มต้นในคลาสนามธรรมได้ การใช้เมธอดเดียวกันจะปรากฏในทุกคลาสที่ได้รับของคลาสนามธรรม ซึ่งละเมิดหลักการ "กฎเดียว สถานที่เดียว" ส่งผลให้เกิดการทำสำเนาโค้ด ซึ่งไม่เอื้ออำนวยเช่นกัน เพื่อการบำรุงรักษาในอนาคต ดังนั้นควรระมัดระวังในการเลือกระหว่าง abstractclass และ interface
การดู abstractclass และอินเทอร์เฟซจากมุมมองของแนวคิดการออกแบบ ข้างต้นกล่าวถึงความแตกต่างระหว่าง abstractclass และอินเทอร์เฟซเป็นหลักจากมุมมองของคำจำกัดความทางไวยากรณ์และการเขียนโปรแกรม ความแตกต่างในระดับเหล่านี้ค่อนข้างต่ำและไม่จำเป็น ส่วนนี้จะวิเคราะห์ความแตกต่างระหว่าง abstractclass และอินเทอร์เฟซจากอีกระดับหนึ่ง: แนวคิดการออกแบบที่สะท้อนจากทั้งสอง ผู้เขียนเชื่ออย่างนั้น