หากถูกถามในการสัมภาษณ์การเขียนโค้ด "อะไรคือความแตกต่างหลักระหว่างอินเทอร์เฟซและคลาสนามธรรม" คำตอบที่ถูกต้องคืออะไร?


ตอบ 1:

ผู้ชายยังมีชีวิตอยู่ฉันเบื่อหน่ายจนตาย

ฉันไม่“ รู้คำตอบ” จริงๆ แต่ฉันรู้ว่าความคิดเห็นของฉันคืออะไร

ฉันใช้อินเทอร์เฟซเป็นสัญญาในการเรียกรหัสในสิ่งที่สามารถคาดหวังได้ มันเป็นนามธรรม - สิ่งที่เป็นจริงเสมอไม่ว่าคุณจะใช้มันอย่างไร สำหรับฉันมันแสดงให้เห็นถึง (โดยทั่วไป) โดเมนแอปพลิเคชัน - เรื่อง

ตัวอย่างล่าสุดของฉันคือ

ส่วนต่อประสาน UserProfiles {
  โหลด  เพิ่มเติม (บัญชี UUID หมายเลข);
}

รหัสการโทรระบุรหัสบัญชีและรับโปรไฟล์กลับมาหากมี

ขณะนี้มีการปรับใช้สองสามอย่างในขณะที่เราเปลี่ยนระบบ คลาสนามธรรมอาจมีประโยชน์ที่นี่

คลาสนามธรรมแสดงถึง 'กลไกที่ปรับแต่งได้' สำหรับฉัน มันไม่ได้เป็นส่วนหนึ่งของเรื่อง ลูกค้าไม่ควรเชื่อถือเป็นสัญญาการให้บริการ

มันเป็นส่วนหนึ่งของการดำเนินการ โดยเฉพาะอย่างยิ่งมันเป็นรหัสการใช้งานทั่วไปที่ใช้ร่วมกันระหว่างการใช้งานอินเทอร์เฟซที่เป็นไปได้สองรายการขึ้นไป

เราอาจมีคลาสนามธรรม

ฐานข้อมูลระดับนามธรรม DatabaseUserProfiles ใช้ UserProfiles {
  โหลด  เพิ่มเติม (บัญชี UUID หมายเลข) {
    สตริง databaseSpecificSql = getQueryFindByAccountNumber (accountNumber);

    return executeQuery (ฐานข้อมูลSpecificSql);
  }

  นามธรรม String getQueryFindByAccountNumber (บัญชี UUID หมายเลข);
}

ในตัวอย่างสมมตินี้เราจะมีผลิตภัณฑ์ฐานข้อมูล SQL สองรายการที่เราสนับสนุนเพื่อจัดเก็บโปรไฟล์และใช้ GoF ‘วิธีเทมเพลต Qu getQueryFindByAccountNumber () เพื่อส่งคืน SQL เฉพาะฐานข้อมูล

ส่วนที่ใช้ร่วมกันของการใช้ฐานข้อมูล SQL ทั่วไปจะอยู่ที่อื่นในคลาสนามธรรมนี้

ดังนั้นใช่ฉันจะมีอินเทอร์เฟซ - สัญญาเรื่อง / ลูกค้า - และการใช้งาน ABC (บางครั้ง) - ใช้ร่วมกัน

วัตถุประสงค์ที่แตกต่างกันสองประการสำหรับการอ่านได้

และใช่ตั้งแต่ Java 8/9/10 อะไรก็ตามบรรทัดนี้จะเบลออย่างที่เคยเป็นใน C ++ ในขณะที่คุณสามารถใช้ ABC เพื่อตอบสนองวัตถุประสงค์ทั้งสองได้ฉันไม่ต้องการเพราะมันไม่ได้สื่อถึงผู้อ่านของฉัน รหัสสิ่งที่ฉันต้องการที่จะพูด

เมื่อมาถึงจุดนี้เราทุกคนต่างก็รู้สึกเบื่อบ้างและก้าวต่อไปสู่ไวท์บอร์ดเล็กน้อย


ตอบ 2:

ฉันเดาว่าจะพูดว่าส่วนต่อประสานรองรับหลายมรดกและคลาสนามธรรมไม่ได้ ความแตกต่างที่สองคือวิธีการทั้งหมดในส่วนต่อประสานจะต้องเป็นนามธรรม

อินเทอร์เฟซเป็นนามธรรมมากกว่าคลาสนามธรรมเอง หากคุณต้องการคุณสามารถสร้างอินเตอร์เฟสที่ขยายส่วนต่อประสานอื่น ๆ

อินเทอร์เฟซเป็นคลาสนามธรรมที่ดีที่สุด คลาสนามธรรมเป็นลูกผสมระหว่างส่วนต่อประสานและชั้นรูปธรรม

คลาสนามธรรมสามารถมีวิธีที่เป็นรูปธรรมและทำให้การสืบทอดหลายอย่างอาจสร้างการแทนที่ทับซ้อนของวิธีที่เป็นรูปธรรมซึ่งไม่ใช่กรณีของการแทนที่ของวิธีการที่เป็นนามธรรมเพราะวิธีการที่เป็นนามธรรมเป็น emtpy ถ้านั่นสมเหตุสมผล

หากคุณดูลำดับชั้นของ Java Collections คุณจะเห็นว่าอินเตอร์เฟสสร้างกราฟ acyclic เหมือนต้นไม้ Git แทนที่จะเป็นแบบไบนารีได้อย่างไรถ้าเป็นกรณีที่ไม่ได้ใช้อินเตอร์เฟส


ตอบ 3:

ฉันเดาว่าจะพูดว่าส่วนต่อประสานรองรับหลายมรดกและคลาสนามธรรมไม่ได้ ความแตกต่างที่สองคือวิธีการทั้งหมดในส่วนต่อประสานจะต้องเป็นนามธรรม

อินเทอร์เฟซเป็นนามธรรมมากกว่าคลาสนามธรรมเอง หากคุณต้องการคุณสามารถสร้างอินเตอร์เฟสที่ขยายส่วนต่อประสานอื่น ๆ

อินเทอร์เฟซเป็นคลาสนามธรรมที่ดีที่สุด คลาสนามธรรมเป็นลูกผสมระหว่างส่วนต่อประสานและชั้นรูปธรรม

คลาสนามธรรมสามารถมีวิธีที่เป็นรูปธรรมและทำให้การสืบทอดหลายอย่างอาจสร้างการแทนที่ทับซ้อนของวิธีที่เป็นรูปธรรมซึ่งไม่ใช่กรณีของการแทนที่ของวิธีการที่เป็นนามธรรมเพราะวิธีการที่เป็นนามธรรมเป็น emtpy ถ้านั่นสมเหตุสมผล

หากคุณดูลำดับชั้นของ Java Collections คุณจะเห็นว่าอินเตอร์เฟสสร้างกราฟ acyclic เหมือนต้นไม้ Git แทนที่จะเป็นแบบไบนารีได้อย่างไรถ้าเป็นกรณีที่ไม่ได้ใช้อินเตอร์เฟส


ตอบ 4:

ฉันเดาว่าจะพูดว่าส่วนต่อประสานรองรับหลายมรดกและคลาสนามธรรมไม่ได้ ความแตกต่างที่สองคือวิธีการทั้งหมดในส่วนต่อประสานจะต้องเป็นนามธรรม

อินเทอร์เฟซเป็นนามธรรมมากกว่าคลาสนามธรรมเอง หากคุณต้องการคุณสามารถสร้างอินเตอร์เฟสที่ขยายส่วนต่อประสานอื่น ๆ

อินเทอร์เฟซเป็นคลาสนามธรรมที่ดีที่สุด คลาสนามธรรมเป็นลูกผสมระหว่างส่วนต่อประสานและชั้นรูปธรรม

คลาสนามธรรมสามารถมีวิธีที่เป็นรูปธรรมและทำให้การสืบทอดหลายอย่างอาจสร้างการแทนที่ทับซ้อนของวิธีที่เป็นรูปธรรมซึ่งไม่ใช่กรณีของการแทนที่ของวิธีการที่เป็นนามธรรมเพราะวิธีการที่เป็นนามธรรมเป็น emtpy ถ้านั่นสมเหตุสมผล

หากคุณดูลำดับชั้นของ Java Collections คุณจะเห็นว่าอินเตอร์เฟสสร้างกราฟ acyclic เหมือนต้นไม้ Git แทนที่จะเป็นแบบไบนารีได้อย่างไรถ้าเป็นกรณีที่ไม่ได้ใช้อินเตอร์เฟส