เมื่อใดควรใช้คลาสนามธรรมเทียบกับอินเทอร์เฟซใน C #

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

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

อธิบายคลาสนามธรรม C #

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

อธิบายอินเตอร์เฟส C #

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

ฉันควรใช้คลาสนามธรรมหรืออินเทอร์เฟซ?

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

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

ตามเอกสารของอินเทอร์เฟซของ Microsoft ระบุว่า:

ตัวอย่างเช่นเมื่อใช้อินเทอร์เฟซคุณสามารถรวมพฤติกรรมจากหลายแหล่งในคลาสได้ ความสามารถนั้นมีความสำคัญใน C # เนื่องจากภาษาไม่รองรับการสืบทอดคลาสหลาย ๆ คลาส นอกจากนี้คุณต้องใช้อินเทอร์เฟซหากคุณต้องการจำลองการสืบทอดสำหรับโครงสร้างเนื่องจากไม่สามารถสืบทอดจากโครงสร้างหรือคลาสอื่นได้

การใช้งานอินเทอร์เฟซโดยนัยและชัดเจน

อินเทอร์เฟซสามารถใช้งานได้โดยปริยายหรืออย่างชัดเจน ให้ฉันอธิบายว่าการใช้งานทั้งสองนี้แตกต่างกันอย่างไร IBusinessLogicพิจารณาอินเตอร์เฟซที่เรียกว่า

อินเทอร์เฟซสาธารณะ IBusinessLogic

{

   เป็นโมฆะ Initialize ();

}

ชื่อคลาสต่อไปนี้BusinessLogicใช้IBusinessLogicอินเทอร์เฟซ

BusinessLogic ระดับสาธารณะ: IBusinessLogic

{

   โมฆะสาธารณะ Initialize ()

   {

       // รหัสบางส่วน

   }

}

คุณสามารถสร้างอินสแตนซ์ของBusinessLogicคลาสได้อย่างชัดเจนจากนั้นเรียกใช้Initialize()เมธอดดังที่แสดงด้านล่าง

 IBusinessLogic businessLogic = BusinessLogic ใหม่ ();

businessLogicInitialize ();

ข้อมูลโค้ดต่อไปนี้แสดงให้เห็นว่าคุณสามารถใช้IBusinessLogicอินเทอร์เฟซโดยนัยได้อย่างไร

BusinessLogic ระดับสาธารณะ: IBusinessLogic

{

   เป็นโมฆะ IBusinessLogic.initialize ()

   {

   }

}

ตอนนี้คุณสามารถเรียกใช้Initialize()วิธีการเดียวกันโดยใช้การอ้างอิงไปยังIBusinessLogicอินเทอร์เฟซ ความแตกต่างในสองแนวทางคือเมื่อคุณใช้อินเทอร์เฟซอย่างชัดเจนในคลาสของคุณคุณถูก จำกัด ให้เรียกใช้วิธีการของอินเทอร์เฟซของคุณโดยใช้การอ้างอิงไปยังอินเทอร์เฟซเท่านั้น ดังนั้นข้อมูลโค้ดต่อไปนี้จะไม่ทำงานกล่าวคือจะไม่คอมไพล์

 BusinessLogic businessLogic = BusinessLogic ใหม่ ();

businessLogicInitialize ();

วิธีทำเพิ่มเติมใน C #:

  • เมื่อใดควรใช้คลาสนามธรรมเทียบกับอินเทอร์เฟซใน C #
  • วิธีทำงานกับ AutoMapper ใน C #
  • วิธีใช้นิพจน์แลมบ์ดาใน C #
  • วิธีการทำงานกับผู้รับมอบสิทธิ์ Action, Func และ Predicate ใน C #
  • วิธีการทำงานกับผู้รับมอบสิทธิ์ใน C #
  • วิธีใช้คนตัดไม้อย่างง่ายใน C #
  • วิธีทำงานกับแอตทริบิวต์ใน C #
  • วิธีการทำงานกับ log4net ใน C #
  • วิธีใช้รูปแบบการออกแบบที่เก็บใน C #
  • วิธีการทำงานกับการสะท้อนใน C #
  • วิธีทำงานกับ filesystemwatcher ใน C #
  • วิธีการเริ่มต้นขี้เกียจใน C #
  • วิธีการทำงานกับ MSMQ ใน C #
  • วิธีการทำงานกับวิธีการขยายใน C #
  • วิธีการใช้แลมบ์ดานิพจน์ใน C #
  • เมื่อใดควรใช้คำสำคัญที่ลบเลือนใน C #
  • วิธีใช้คีย์เวิร์ดผลตอบแทนใน C #
  • วิธีการใช้ความหลากหลายใน C #
  • วิธีสร้างตัวกำหนดตารางเวลางานของคุณเองใน C #
  • วิธีการทำงานกับ RabbitMQ ใน C #
  • วิธีการทำงานกับทูเปิลใน C #
  • สำรวจวิธีการเสมือนและนามธรรมใน C #