Bilakah menggunakan kelas abstrak vs antara muka dalam C #

Semasa merancang aplikasi, penting untuk mengetahui kapan menggunakan kelas abstrak dan kapan menggunakan antara muka. Walaupun kelas abstrak dan antara muka kelihatan serupa dalam beberapa cara, terdapat perbezaan utama yang akan menentukan pilihan terbaik untuk apa yang anda cuba capai. Dalam catatan blog ini saya akan membincangkan perbezaan tersebut dan bagaimana memutuskan kapan harus menggunakan mana.

Jawapan ringkas: Kelas abstrak membolehkan anda membuat fungsi yang boleh dilaksanakan atau diganti oleh subkelas. Antaramuka hanya membolehkan anda menentukan fungsi, bukan melaksanakannya. Walaupun kelas hanya dapat meluaskan satu kelas abstrak, kelas boleh memanfaatkan pelbagai antara muka. 

C abstrak kelas dijelaskan

Kelas abstrak adalah jenis kelas khas yang tidak dapat dijadikan contoh. Kelas abstrak dirancang untuk diwarisi oleh subkelas yang sama ada melaksanakan atau mengatasi kaedahnya. Dengan kata lain, kelas abstrak sama ada dilaksanakan sebahagiannya atau tidak dilaksanakan sama sekali. Anda boleh mempunyai fungsi dalam kelas abstrak anda - kaedah dalam kelas abstrak boleh bersifat abstrak dan konkrit. Kelas abstrak boleh mempunyai pembina - ini adalah satu perbezaan utama antara kelas abstrak dan antara muka. Anda boleh memanfaatkan kelas abstrak untuk merancang komponen dan menentukan beberapa tahap fungsi bersama yang mesti dilaksanakan oleh kelas turunan.

Antara muka C # dijelaskan

Antaramuka pada dasarnya adalah kontrak - ia tidak mempunyai pelaksanaan. Antaramuka hanya boleh mengandungi pernyataan kaedah; ia tidak boleh mengandungi definisi kaedah. Anda juga tidak boleh mempunyai data ahli dalam antara muka. Walaupun kelas abstrak mungkin mengandungi definisi kaedah, bidang, dan konstruktor, antara muka mungkin hanya mempunyai pernyataan peristiwa, kaedah, dan sifat. Kaedah yang dinyatakan dalam antara muka mesti dilaksanakan oleh kelas yang melaksanakan antara muka. Perhatikan bahawa kelas dapat melaksanakan lebih daripada satu antara muka tetapi hanya memanjangkan satu kelas. Kelas yang melaksanakan antara muka harus melaksanakan semua anggotanya. Seperti kelas abstrak, antara muka tidak dapat dibuat.

Sekiranya saya menggunakan kelas abstrak atau antara muka?

Kelas abstrak memberi anda fleksibiliti untuk mempunyai kaedah konkrit tertentu dan beberapa kaedah lain yang harus dilaksanakan oleh kelas turunan. Sebaliknya, jika anda menggunakan antara muka, anda perlu menerapkan semua kaedah dalam kelas yang memperluas antara muka. Kelas abstrak adalah pilihan yang baik jika anda mempunyai rancangan untuk pengembangan masa depan - iaitu jika pengembangan masa depan kemungkinan besar dalam hierarki kelas. Sekiranya anda ingin memberikan sokongan untuk pengembangan masa depan ketika menggunakan antara muka, anda perlu memperluas antara muka dan membuat yang baru.

Dengan catatan yang berbeza, mudah untuk menambahkan antara muka baru ke hierarki jika perlu. Walau bagaimanapun, jika anda sudah mempunyai kelas abstrak dalam hierarki anda, anda tidak boleh menambahkan kelas lain — iaitu, anda boleh menambahkan kelas abstrak hanya jika tidak ada yang tersedia. Anda harus menggunakan antara muka jika anda mahukan kontrak mengenai beberapa tingkah laku atau fungsi. Anda tidak boleh menggunakan antara muka jika anda perlu menulis kod yang sama untuk kaedah antara muka. Dalam kes ini, anda harus menggunakan kelas abstrak, menentukan kaedah sekali, dan menggunakannya semula mengikut keperluan. Gunakan antara muka untuk mencabut kod aplikasi anda dari pelaksanaan tertentu, atau untuk menyekat akses kepada anggota jenis tertentu.

Sebagai dokumentasi antara muka Microsoft menyatakan:

Dengan menggunakan antara muka, anda boleh, misalnya, memasukkan tingkah laku dari pelbagai sumber dalam kelas. Keupayaan itu penting dalam C # kerana bahasa tidak menyokong pelbagai warisan kelas. Selain itu, anda mesti menggunakan antara muka jika anda ingin mensimulasikan pewarisan untuk struktur, kerana mereka sebenarnya tidak dapat mewarisi dari struktur atau kelas lain.

Pelaksanaan antara muka yang tersirat dan tersurat

Antaramuka dapat dilaksanakan secara tersirat atau tersurat. Izinkan saya menerangkan bagaimana kedua pelaksanaan ini berbeza. Pertimbangkan antara muka yang dipanggil IBusinessLogic.

antara muka awam IBusinessLogic

{

   batal Memulakan ();

}

Kelas berikut bernama BusinessLogicmenerapkan IBusinessLogicantara muka.

kelas awam BusinessLogic: IBusinessLogic

{

   kekosongan awam Memulakan ()

   {

       // Beberapa kod

   }

}

Anda boleh membuat contoh BusinessLogickelas secara eksplisit dan kemudian memanggil Initialize()kaedah seperti yang ditunjukkan di bawah.

 IBusinessLogic businessLogic = BusinessLogic baru ();

businessLogic.Initialize ();

Coretan kod berikut menggambarkan bagaimana anda dapat melaksanakan IBusinessLogicantara muka secara tidak langsung.

kelas awam BusinessLogic: IBusinessLogic

{

   batal IBusinessLogic.Initialize ()

   {

   }

}

Anda kini boleh menggunakan Initialize()kaedah dengan cara yang sama menggunakan rujukan ke IBusinessLogicantara muka. Perbezaan dalam kedua pendekatan tersebut adalah bahawa ketika anda menerapkan antarmuka secara eksplisit di kelas anda, anda terpaksa menggunakan kaedah antara muka anda dengan menggunakan rujukan ke antara muka sahaja. Oleh itu, coretan kod berikut tidak akan berfungsi, iaitu tidak akan disusun.

 BusinessLogic businessLogic = BusinessLogic baru ();

businessLogic.Initialize ();

Cara melakukan lebih banyak perkara di C #:

  • Bilakah menggunakan kelas abstrak vs antara muka dalam C #
  • Cara bekerja dengan AutoMapper di C #
  • Cara menggunakan ungkapan lambda dalam C #
  • Cara bekerjasama dengan delegasi Action, Func, dan Predicate di C #
  • Cara bekerja dengan perwakilan di C #
  • Cara melaksanakan pembalak sederhana di C #
  • Cara bekerja dengan atribut di C #
  • Cara bekerja dengan log4net di C #
  • Cara melaksanakan corak reka bentuk repositori di C #
  • Cara bekerja dengan refleksi di C #
  • Cara bekerja dengan pemantau sistem fail di C #
  • Cara melakukan inisial malas di C #
  • Cara bekerja dengan MSMQ di C #
  • Cara bekerja dengan kaedah peluasan di C #
  • Bagaimana untuk kami ungkapan lambda dalam C #
  • Bilakah menggunakan kata kunci tidak stabil dalam C #
  • Cara menggunakan kata kunci hasil dalam C #
  • Cara melaksanakan polimorfisme dalam C #
  • Bagaimana membina penjadual tugas anda sendiri di C #
  • Cara bekerja dengan RabbitMQ di C #
  • Cara bekerja dengan tuple di C #
  • Meneroka kaedah maya dan abstrak dalam C #