ทั้งการสืบทอดคลาสและส่วนต่อประสานทั้งคู่มีตำแหน่งของตัวเอง การสืบทอดหมายความว่า "เป็น" ในขณะที่อินเทอร์เฟซมีสัญญาที่กำหนดสิ่งที่ "ทำตัวเหมือน"
ฉันจะบอกว่าการใช้อินเทอร์เฟซให้บ่อยขึ้นนั้นไม่ใช่การฝึกฝนที่ไม่ดีเลย ตอนนี้ฉันกำลังอ่าน "Effective C # - 50 วิธีเฉพาะเพื่อปรับปรุง C # ของคุณ" โดย Bill Wagner หมายเลขสินค้า 22 ฯ และฉันพูด "ชอบกำหนดและใช้อินเทอร์เฟซการสืบทอด"
โดยทั่วไปฉันใช้คลาสฐานเมื่อฉันต้องการกำหนดการใช้งานทั่วไปของพฤติกรรมทั่วไประหว่างประเภทที่เกี่ยวข้องกับแนวคิด บ่อยครั้งที่ฉันใช้อินเทอร์เฟซ ในความเป็นจริงฉันมักเริ่มต้นด้วยการกำหนดอินเทอร์เฟซสำหรับคลาสเมื่อฉันเริ่มสร้าง ... แม้ว่าในท้ายที่สุดฉันไม่ได้รวบรวมอินเทอร์เฟซฉันพบว่ามันช่วยในการเริ่มต้นด้วยการกำหนด API สาธารณะของ ชั้นเรียนจากการไป ถ้าฉันพบว่าฉันมีหลายคลาสทั้งการใช้อินเทอร์เฟซและตรรกะการใช้งานจะเหมือนกันเท่านั้นฉันจะถามตัวเองว่าเหมาะสมหรือไม่ที่จะนำคลาสพื้นฐานทั่วไปมาใช้ร่วมกัน
คู่ของคำพูดจากหนังสือ Bill Wagners ...
คลาสที่ได้รับทั้งหมดรวมพฤติกรรมนั้นทันที การเพิ่มสมาชิกในอินเตอร์เฟสจะแบ่งคลาสทั้งหมดที่ใช้อินเตอร์เฟสนั้น พวกเขาจะไม่ประกอบด้วยวิธีการใหม่และจะไม่รวบรวมอีกต่อไป ผู้ดำเนินการแต่ละคนจะต้องอัปเดตประเภทนั้นเพื่อรวมสมาชิกใหม่ การเลือกระหว่างคลาสพื้นฐานที่เป็นนามธรรมและอินเทอร์เฟซเป็นคำถามที่ดีที่สุดที่จะสนับสนุน abstractions ของคุณเมื่อเวลาผ่านไป อินเทอร์เฟซได้รับการแก้ไข: คุณปล่อยอินเทอร์เฟซเป็นสัญญาสำหรับชุดของฟังก์ชันที่ชนิดใดก็ได้ที่สามารถใช้งานได้ คลาสฐานสามารถขยายได้เมื่อเวลาผ่านไป ส่วนขยายเหล่านั้นกลายเป็นส่วนหนึ่งของทุกคลาสที่ได้รับ ทั้งสองรุ่นสามารถผสมกันเพื่อนำมาใช้ใหม่รหัสการใช้งานในขณะที่รองรับหลายอินเตอร์เฟส " พวกเขาจะไม่ประกอบด้วยวิธีการใหม่และจะไม่รวบรวมอีกต่อไป ผู้ดำเนินการแต่ละคนจะต้องอัปเดตประเภทนั้นเพื่อรวมสมาชิกใหม่ การเลือกระหว่างคลาสพื้นฐานที่เป็นนามธรรมและอินเทอร์เฟซเป็นคำถามที่ดีที่สุดที่จะสนับสนุน abstractions ของคุณเมื่อเวลาผ่านไป อินเทอร์เฟซได้รับการแก้ไข: คุณปล่อยอินเทอร์เฟซเป็นสัญญาสำหรับชุดของฟังก์ชันที่ชนิดใดก็ได้ที่สามารถใช้งานได้ คลาสฐานสามารถขยายได้เมื่อเวลาผ่านไป ส่วนขยายเหล่านั้นกลายเป็นส่วนหนึ่งของทุกคลาสที่ได้รับ ทั้งสองรุ่นสามารถผสมกันเพื่อนำมาใช้ใหม่รหัสการใช้งานในขณะที่รองรับหลายอินเตอร์เฟส " พวกเขาจะไม่ประกอบด้วยวิธีการใหม่และจะไม่รวบรวมอีกต่อไป ผู้ดำเนินการแต่ละคนจะต้องอัปเดตประเภทนั้นเพื่อรวมสมาชิกใหม่ การเลือกระหว่างคลาสพื้นฐานที่เป็นนามธรรมและอินเทอร์เฟซเป็นคำถามที่ดีที่สุดที่จะสนับสนุน abstractions ของคุณเมื่อเวลาผ่านไป อินเทอร์เฟซได้รับการแก้ไข: คุณปล่อยอินเทอร์เฟซเป็นสัญญาสำหรับชุดของฟังก์ชันที่ชนิดใดก็ได้ที่สามารถใช้งานได้ คลาสฐานสามารถขยายได้เมื่อเวลาผ่านไป ส่วนขยายเหล่านั้นกลายเป็นส่วนหนึ่งของทุกคลาสที่ได้รับ ทั้งสองรุ่นสามารถผสมกันเพื่อนำมาใช้ใหม่รหัสการใช้งานในขณะที่รองรับหลายอินเตอร์เฟส " คุณปล่อยอินเทอร์เฟซเป็นสัญญาสำหรับชุดของฟังก์ชันที่ชนิดใดก็ได้ที่สามารถใช้งานได้ คลาสฐานสามารถขยายได้เมื่อเวลาผ่านไป ส่วนขยายเหล่านั้นกลายเป็นส่วนหนึ่งของทุกคลาสที่ได้รับ ทั้งสองรุ่นสามารถผสมกันเพื่อนำมาใช้ใหม่รหัสการใช้งานในขณะที่รองรับหลายอินเตอร์เฟส " คุณปล่อยอินเทอร์เฟซเป็นสัญญาสำหรับชุดของฟังก์ชันที่ชนิดใดก็ได้ที่สามารถใช้งานได้ คลาสฐานสามารถขยายได้เมื่อเวลาผ่านไป ส่วนขยายเหล่านั้นกลายเป็นส่วนหนึ่งของทุกคลาสที่ได้รับ ทั้งสองรุ่นสามารถผสมกันเพื่อนำมาใช้ใหม่รหัสการใช้งานในขณะที่รองรับหลายอินเตอร์เฟส "
"อินเทอร์เฟซการเข้ารหัสมอบความยืดหยุ่นให้กับนักพัฒนาอื่น ๆ มากกว่าการเข้ารหัสในประเภทคลาสพื้นฐาน"
"การใช้อินเทอร์เฟซเพื่อกำหนด API สำหรับคลาสให้ความยืดหยุ่นที่มากขึ้น"
"เมื่อประเภทของคุณแสดงคุณสมบัติเป็นประเภทคลาสจะเปิดเผยทั้งอินเตอร์เฟสไปยังคลาสนั้นการใช้อินเตอร์เฟสคุณสามารถเลือกเปิดเผยเฉพาะวิธีการและคุณสมบัติที่คุณต้องการให้ลูกค้าใช้"
"คลาสพื้นฐานอธิบายและใช้งานพฤติกรรมทั่วไปในรูปแบบคอนกรีตที่เกี่ยวข้องส่วนต่อประสานอธิบายถึงชิ้นส่วนของการทำงานของอะตอมที่ประเภทคอนกรีตที่ไม่เกี่ยวข้องสามารถนำมาใช้ได้ทั้งสองมีตำแหน่งคลาสกำหนดประเภทที่คุณสร้างส่วนต่อประสานอธิบายพฤติกรรมของประเภทเหล่านั้น หากคุณเข้าใจความแตกต่างคุณจะสร้างการออกแบบที่แสดงออกซึ่งยืดหยุ่นได้มากขึ้นเมื่อเผชิญหน้ากับการเปลี่ยนแปลงใช้ลำดับชั้นของคลาสเพื่อกำหนดประเภทที่เกี่ยวข้องเปิดเผยฟังก์ชันการทำงานโดยใช้อินเตอร์เฟสที่ใช้ข้ามประเภทเหล่านั้น "