ฉันใช้การปรับใช้อินเตอร์เฟสอย่างชัดเจนเกือบทุกครั้ง นี่คือเหตุผลหลัก
การปรับโครงสร้างใหม่นั้นปลอดภัยยิ่งขึ้น
เมื่อเปลี่ยนอินเทอร์เฟซจะเป็นการดีกว่าหากคอมไพเลอร์สามารถตรวจสอบได้ สิ่งนี้ยากกว่าการใช้งานโดยปริยาย
สองกรณีทั่วไปที่นึกถึง:
เพิ่มฟังก์ชั่นอินเตอร์เฟซที่ชั้นที่มีอยู่ที่การดำเนินการอินเตอร์เฟซนี้แล้วเกิดขึ้นจะมีวิธีการที่มีลายเซ็นเช่นเดียวกับหนึ่งใหม่ สิ่งนี้สามารถนำไปสู่พฤติกรรมที่ไม่คาดคิดและกัดฉันอย่างหนักหลายครั้ง เป็นการยากที่จะ "เห็น" เมื่อทำการดีบั๊กเนื่องจากฟังก์ชั่นนั้นไม่น่าจะอยู่ที่วิธีการอินเทอร์เฟซอื่น ๆ ในไฟล์ (ปัญหาการจัดทำเอกสารด้วยตนเองดังกล่าวข้างล่าง)
ฟังก์ชั่นการถอดจากอินเตอร์เฟซ วิธีการที่นำมาใช้โดยนัยจะเป็นรหัสตายทันที แต่วิธีการที่นำมาใช้อย่างชัดเจนจะได้รับการติดโดยข้อผิดพลาดในการคอมไพล์ แม้ว่ารหัสที่ตายแล้วจะดีอยู่รอบ ๆ ฉันต้องการที่จะถูกบังคับให้ตรวจทานและส่งเสริมมัน
โชคไม่ดีที่ C # ไม่มีคำหลักที่บังคับให้เราทำเครื่องหมายวิธีเป็นการติดตั้งโดยปริยายดังนั้นคอมไพเลอร์สามารถทำการตรวจสอบพิเศษได้ วิธีเสมือนไม่มีปัญหาใด ๆ ข้างต้นเนื่องจากต้องใช้ 'override' และ 'new'
หมายเหตุ: สำหรับอินเทอร์เฟซคงที่หรือเปลี่ยนแปลงบ่อยครั้ง (โดยทั่วไปมาจาก API ของผู้ขาย) นี่ไม่ใช่ปัญหา สำหรับอินเทอร์เฟซของฉันฉันไม่สามารถคาดการณ์ได้ว่าจะเปลี่ยนแปลงเมื่อใด / อย่างไร
มันเป็นเอกสารด้วยตนเอง
ถ้าฉันเห็น 'public bool Execute ()' ในชั้นเรียนมันจะต้องใช้ความพยายามเป็นพิเศษในการหาว่ามันเป็นส่วนหนึ่งของส่วนต่อประสาน ใครบางคนอาจจะต้องแสดงความคิดเห็นมันพูดอย่างนั้นหรือวางไว้ในกลุ่มของการใช้งานอินเทอร์เฟซอื่น ๆ ทั้งหมดภายใต้ภูมิภาคหรือความคิดเห็นการจัดกลุ่มพูดว่า "การใช้ ITask" แน่นอนว่าใช้งานได้เฉพาะในกรณีที่ส่วนหัวของกลุ่มไม่ได้อยู่นอกจอ ..
โดยที่: 'bool ITask.Execute ()' ชัดเจนและไม่คลุมเครือ
การแยกการใช้อินเตอร์เฟสอย่างชัดเจน
ฉันคิดว่าอินเทอร์เฟซเป็น 'สาธารณะ' มากกว่าวิธีสาธารณะเพราะพวกมันถูกออกแบบมาเพื่อให้เปิดเผยเพียงเล็กน้อยของพื้นที่ผิวของประเภทคอนกรีต พวกเขาลดประเภทลงเป็นความสามารถพฤติกรรมชุดของคุณลักษณะ ฯลฯ และในการดำเนินการฉันคิดว่ามันมีประโยชน์ในการแยกกัน
ขณะที่ฉันกำลังดูรหัสของคลาสเมื่อฉันเจอการใช้อินเทอร์เฟซที่ชัดเจนสมองของฉันเปลี่ยนเป็นโหมด "สัญญารหัส" บ่อยครั้งที่การใช้งานเหล่านี้ส่งต่อไปยังวิธีการอื่น ๆ แต่บางครั้งพวกเขาจะทำการตรวจสอบสถานะ / พารามิเตอร์พิเศษเพิ่มเติมการแปลงพารามิเตอร์ขาเข้าให้ดีขึ้นตรงกับข้อกำหนดภายในหรือแม้แต่การแปลเพื่อวัตถุประสงค์ในการกำหนดเวอร์ชัน
(ฉันตระหนักว่าสาธารณะเป็นสัญญารหัส แต่ส่วนต่อประสานนั้นแข็งแกร่งกว่ามากโดยเฉพาะอย่างยิ่งในฐานข้อมูลที่ขับเคลื่อนด้วยอินเตอร์เฟสซึ่งการใช้งานโดยตรงประเภทคอนกรีตมักเป็นสัญลักษณ์ของรหัสภายในเท่านั้น)
ที่เกี่ยวข้อง: เหตุผลที่ 2 ข้างต้นโดยจอน
และอื่น ๆ
บวกกับข้อดีที่ได้กล่าวไปแล้วในคำตอบอื่น ๆ ที่นี่:
ปัญหาที่เกิดขึ้น
มันไม่ใช่เรื่องสนุกและมีความสุข มีบางกรณีที่ฉันติดกับ implicits:
- ประเภทค่าเพราะนั่นจะต้องใช้มวยและลดความสมบูรณ์ นี่ไม่ใช่กฎที่เข้มงวดและขึ้นอยู่กับส่วนต่อประสานและวิธีการใช้งาน IComparable? โดยปริยาย IFormattable? อาจชัดเจน
- ส่วนต่อประสานระบบเล็กน้อยที่มีวิธีการที่เรียกบ่อยๆโดยตรง (เช่น IDisposable.Dispose)
นอกจากนี้อาจเป็นเรื่องยากที่จะทำการคัดเลือกนักแสดงเมื่อคุณมีรูปแบบที่เป็นรูปธรรมและต้องการเรียกวิธีการอินเทอร์เฟซที่ชัดเจน ฉันจัดการกับสิ่งนี้ในหนึ่งในสองวิธี:
- เพิ่มสาธารณะและให้วิธีการอินเทอร์เฟซส่งต่อเพื่อนำไปใช้งาน มักเกิดขึ้นกับอินเทอร์เฟซที่ง่ายขึ้นเมื่อทำงานภายใน
- (วิธีที่แนะนำของฉัน) เพิ่ม
public IMyInterface I { get { return this; } }
(ซึ่งควรจะได้รับ inlined) foo.I.InterfaceMethod()
และโทร หากมีหลายอินเตอร์เฟสที่ต้องการความสามารถนี้ให้ขยายชื่อเกินกว่าที่ฉัน (จากประสบการณ์ของฉันมันหายากที่ฉันมีความต้องการนี้)