ถ้าชั้นเรียนของฉันimplements
มีอินเตอร์เฟซฉันจะบอกได้ไหมว่าฉันกำลังติดตามมรดกอยู่? ฉันรู้ว่าเมื่อเรียนextends
อีกชั้นหนึ่งแล้วมันเป็นมรดก
ถ้าชั้นเรียนของฉันimplements
มีอินเตอร์เฟซฉันจะบอกได้ไหมว่าฉันกำลังติดตามมรดกอยู่? ฉันรู้ว่าเมื่อเรียนextends
อีกชั้นหนึ่งแล้วมันเป็นมรดก
คำตอบ:
UPDATE: ฉันได้แก้ไขคำตอบนี้แล้ว มีการเพิ่มคะแนนดี ๆ ในความคิดเห็นที่สมควรได้รับการโทรออก
ถ้าชั้นเรียนของฉันใช้อินเทอร์เฟซฉันจะบอกได้ไหมว่าฉันกำลังติดตามมรดกอยู่?
ไม่ชัดเจนว่าคุณหมายถึงอะไรโดยการ "ติดตามมรดก" ลองถามคำถามที่แตกต่างกันเล็กน้อย
มรดกคืออะไร
สิ่งเหล่านี้แตกต่างกันเล็กน้อย นั่นเป็นโชคร้ายเพราะมันทำให้เกิดความสับสน
อะไรคือความสับสนที่เกิดขึ้นจากความแตกต่างที่ลึกซึ้งนี้?
ความสับสนอาจเกิดขึ้นเพราะผู้คนคิดว่าการสืบทอดเป็นกลไกในการแบ่งปันรายละเอียดการนำไปปฏิบัติ แม้ว่ามันจะเป็นเช่นกลไกกลไกที่ทำงานได้ด้วยการแบ่งปันสมาชิก สมาชิกเหล่านั้นไม่จำเป็นต้องมีการใช้งาน! อย่างที่เราจะเห็นพวกเขาสามารถเป็นนามธรรม
ฉันเองจะมีความสุขมากขึ้นถ้าข้อกำหนดของ Java และ C # ใช้คำอื่นที่ไม่ใช่ "สืบทอด" เพื่ออธิบายความสัมพันธ์ระหว่างวิธีการอินเตอร์เฟสและคลาสเพื่อหลีกเลี่ยงความสับสนนี้ แต่พวกเขาทำไม่ได้และเราต้องเหตุผลจากข้อกำหนดไม่ได้กับพวกเขา
ใน Java สมาชิกอินเทอร์เฟซที่สืบทอดโดยคลาสที่ใช้งานได้หรือไม่
ใช่บางคน ดูหัวข้อข้อมูลจำเพาะ Java 8.4.8 ซึ่งฉันพูดที่นี่เพื่อความสะดวกของคุณ
คลาส C สืบทอดมาจาก direct superclass และ direct superinterfaces ทั้งหมดเป็นนามธรรมและวิธีการเริ่มต้น m ซึ่งทั้งหมดต่อไปนี้เป็นจริง: [... ]
ถ้าคุณบอกว่าคลาสใช้อินเทอร์เฟซแล้วคลาสจะสืบทอดเมธอด abstract และ default ของอินเตอร์เฟสนั้น (แน่นอนฉันได้ละเว้นเงื่อนไขที่ตามมาดูข้อกำหนดสำหรับรายละเอียดโดยเฉพาะอย่างยิ่งคลาสที่ใช้งานสมาชิกของอินเทอร์เฟซจะไม่ถือว่ามีการสืบทอดสมาชิกนั้นอีกครั้งจะสับสนหรือไม่ใช่)
โดยทั่วไปเราจะพูดใน Java ว่าคลาสสืบทอดมาจากส่วนต่อประสานหรือไม่?
โดยทั่วไปแล้วเราจะบอกว่าคลาสใช้อินเทอร์เฟซ ดังที่ระบุไว้ข้างต้นคลาสอาจสืบทอดสมาชิกจากอินเทอร์เฟซและยังไม่ได้รับการกล่าวเพื่อสืบทอดจากอินเทอร์เฟซ สิ่งที่น่าสับสนใช่
ความแตกต่างที่ลึกซึ้งนี้มีความสำคัญในการทำงานในแต่ละวันหรือไม่?
โดยทั่วไปไม่ได้ การแยกวิเคราะห์สเปคแบบแคบนี้มีประโยชน์สำหรับนักเขียนคอมไพเลอร์มากกว่าผู้พัฒนาธุรกิจ สิ่งสำคัญคือต้องเข้าใจว่าเมื่อใดที่ต้องใช้อินเทอร์เฟซมากกว่าที่จะได้คำจำกัดความที่แม่นยำของ "การสืบทอดจาก"
java
ดังนั้นนี่คือคำตอบที่ถูกต้องเว้นแต่ว่า OP หมายถึงjava
:-) อื่น ๆ
การสืบทอดหมายถึงการเขียนคลาสย่อยใหม่สำหรับซูเปอร์คลาส การเขียนคลาสใหม่กับอินเตอร์เฟสกำลังใช้อินเตอร์เฟสนั้น (และการเขียนอินเทอร์เฟซใหม่ที่ใช้แบบเก่านั้นเป็นการขยายส่วนต่อประสานนั้น)
เพียงคำที่ถูกต้องที่ใช้กับทั้งสามเป็นไปได้ที่จะSubtyping ไม่ใช่ทุกประเภทย่อยเป็นประเภทย่อย
ด้วยคลาสย่อยคุณ
ด้วยส่วนต่อประสานคุณเติมเต็มสัญญาโดยใช้วิธีการที่ประกาศไว้
นั่นเป็นวิธีคลาสสิคในการดู ขณะนี้มีJava 8อินเตอร์เฟสกลายเป็นส่วนผสม:
การใช้อินเทอร์เฟซที่มีวิธีการทั้งหมดที่มีการใช้งานเริ่มต้นยังคงนับเป็น 'ใช้' หรือมากกว่าส่วนขยาย? ฉันไม่สามารถบอกได้ เนื่องจากกรณีนี้ค่อนข้างไกล (จริง ๆ แล้วเปิดใช้งานหลายมรดกไร้สัญชาติ) ฉันยังคงใช้ 'มรดก' กับคลาสย่อยเท่านั้น