Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 18805|Jawab: 0

[Komunikasi] Persamaan dan perbedaan antara abstrak virtual dan (abstrak) dan antarmuka di C#...

[Salin tautan]
Diposting pada 22/04/2019 14.41.09 | | |
Interpretasi 1

Di C#, Abstrak dan Virtual membingungkan, keduanya terkait dengan pewarisan, dan melibatkan penggunaan penggantian. Mari kita bahas perbedaan antara keduanya:

1. Metode virtual

Virtual digunakan untuk memodifikasi metode di kelas dasar. Ada dua situasi di mana virtual digunakan:

Skenario 1: Metode virtual ditentukan di kelas dasar, tetapi metode virtual tidak ditulis ulang di kelas turunan. Dalam panggilan ke instans kelas turunan, metode virtual menggunakan metode yang ditentukan oleh kelas dasar.

Skenario 2: Metode virtual didefinisikan di kelas dasar dan kemudian metode ditulis ulang menggunakan penggantian di kelas turunan. Dalam panggilan ke instans kelas turunan, metode virtual menggunakan metode penulisan ulang turunan.

2. Metode abstrak (metode abstrak)

Kata kunci abstrak hanya dapat digunakan di kelas abstrak untuk memodifikasi metode, dan tidak ada implementasi khusus. Implementasi metode abstrak harus diimplementasikan menggunakan kata kunci penggantian di kelas turunan.

Perbedaan paling mendasar antara antarmuka dan kelas abstrak: kelas abstrak adalah kelas yang tidak lengkap, abstraksi objek, sedangkan antarmuka adalah norma perilaku.


3. Kata kunci

Statis: Ketika metode dideklarasikan sebagai Statis, metode tersebut adalah metode statis dan pengkompilasi menyimpan implementasi metode pada waktu kompilasi. Artinya, metode tersebut milik kelas, tetapi bukan anggota mana pun, terlepas dari apakah instans kelas ada atau tidak. Sama seperti fungsi entri Static void Main, karena merupakan fungsi statis, dapat dipanggil secara langsung.

Virtua: Ketika metode dideklarasikan sebagai Virtual, itu adalah metode virtual sampai Anda menggunakan variabel ClassName = ClassName(); Sebelum mendeklarasikan instance kelas, itu tidak ada di ruang memori nyata. Kata kunci ini sangat umum digunakan dalam pewarisan kelas untuk memberikan dukungan polimorfisme untuk metode kelas.

overrride: menunjukkan penulisan ulang Kelas ini diwarisi dari kelas Shape
virtual, abstrak adalah memberi tahu kelas lain yang ingin mewarisi darinya bahwa Anda dapat mengganti metode atau properti saya ini, jika tidak, itu tidak diizinkan.
Abstrak: deklarasi metode abstrak adalah metode yang harus ditimpa oleh kelas turunan, yang digunakan untuk diwariskan; Ini dapat dianggap sebagai metode imajiner tanpa realisasi; Jika kelas berisi metode abstrak, maka kelas tersebut harus didefinisikan sebagai kelas abstrak, apakah itu berisi metode umum lainnya atau tidak; Kelas abstrak tidak dapat memiliki substansi.

a) Metode modifikasi virtual harus memiliki implementasi metode (meskipun hanya sepasang kurung kurawal), dan metode modifikasi abstrak tidak dapat memiliki implementasi.

b) virtual dapat ditulis ulang oleh subkelas, abstrak harus ditulis ulang oleh subkelas

c) Jika suatu fungsi dalam suatu kelas dimodifikasi dengan abstact, nama kelas juga harus dimodifikasi dengan abstact

d) Kelas modifikasi abstrak tidak dapat dibuat instance.

e) Jika metode di C# disiapkan untuk menulis ulang kelas induk di subkelas, metode harus dimodifikasi dengan virtual di kelas induk dan menggantikan di subkelas, menghindari pemrogram secara tidak sengaja menulis ulang metode induk dari kelas induk di subkelas.

Catatan: Kelas yang dimodifikasi dengan abstrak hanya dapat diwariskan, bukan dibuat-buat.

Interpretasi 2

Virtual dan abstrak digunakan untuk memodifikasi kelas induk, memungkinkan kelas anak didefinisikan ulang dengan mengganti definisi kelas induk.

Mereka memiliki satu kesamaan: jika digunakan untuk memodifikasi metode, publik harus ditambahkan di depannya, jika tidak, akan ada kesalahan kompilasi: metode virtual atau metode abstrak tidak dapat bersifat pribadi. Lagi pula, menambahkan virtual atau abstrak memungkinkan subkelas didefinisikan ulang, dan anggota pribadi tidak dapat diakses oleh subkelas.

Tapi mereka sangat berbeda. (virtual adalah "virtual", abstrak adalah "abstrak").

(1) Metode modifikasi virtual harus diterapkan (meskipun hanya menambahkan sepasang kurung kurawal), sedangkan metode modifikasi abstrak tidak boleh diterapkan. Misalnya, jika metode modifikasi virtual tidak diterapkan:

Kesalahan: "Test1.fun1()" harus mendeklarasikan isi karena tidak ditandai sebagai abstrak, eksternal, atau parsial   

Untuk pengubah abstrak, jika diterapkan:


Kesalahan: "Test2.fun2()" tidak dapat mendeklarasikan isi karena ditandai sebagai abstrak   

(2) virtual dapat ditulis ulang oleh subkelas, sedangkan abstrak harus ditulis ulang oleh subkelas.
Tidak ada kesalahan dalam mengkompilasi, jika metode pengubah virtual ditulis ulang, penggantian harus ditambahkan di depannya (yang memberi tahu kompiler bahwa Anda ingin menulis ulang metode virtual), dan harus ada implementasi, jika tidak, kompilasi akan salah:
(3) Jika anggota kelas dimodifikasi oleh abstrak, abstrak harus ditambahkan sebelum kelas, karena hanya kelas abstrak yang dapat memiliki metode abstrak.

(4) Instans kelas abstrak tidak dapat dibuat, mereka hanya dapat diwariskan dan tidak dapat dibuat, misalnya: BaseTest2 base2 = BaseTest2(); Akan ada kesalahan kompilasi: Kelas atau antarmuka abstrak tidak dapat membuat instance.

(5) Di C#, jika Anda ingin menulis ulang metode dalam subkelas, Anda harus menambahkan virtual sebelum metode induk dan mengganti sebelum metode subkelas, untuk menghindari pemrogram secara tidak sengaja menulis ulang metode induk di subkelas.

(6) Metode abstrak harus ditimpa, dan metode virtual harus memiliki implementasi (bahkan jika itu adalah metode yang didefinisikan dalam kelas abstrak).
Interpretasi 3
Persamaan:
1. Mereka semua bisa diwariskan
2. Tak satu pun dari mereka yang dapat dibuat-buat
3. Dapat berisi deklarasi metode
4. Kelas turunan harus menerapkan metode yang belum direalisasikan
Membedakan:
1. Kelas dasar abstrak dapat menentukan bidang, atribut, dan implementasi metode. Antarmuka hanya dapat menentukan atribut, pengindeks, peristiwa, dan deklarasi metode, dan tidak dapat berisi bidang.
2. Kelas abstrak adalah kelas yang tidak lengkap yang perlu disempurnakan lebih lanjut, sedangkan antarmuka adalah norma perilaku. Antarmuka khusus Microsoft selalu dilengkapi dengan bidang yang mampu untuk membuktikan bahwa mereka adalah ekspresi dari "Saya bisa melakukannya..." ”
3. Antarmuka dapat diimplementasikan beberapa kali, dan kelas abstrak hanya dapat diwarisi oleh satu orang
4. Kelas abstrak lebih didefinisikan di antara serangkaian kelas yang terkait erat, sementara sebagian besar antarmuka terkait secara longgar tetapi semuanya mengimplementasikan fungsi tertentu
5. Kelas abstrak adalah konsep yang diabstraksikan dari serangkaian objek terkait, sehingga mencerminkan kesamaan internal dari berbagai hal; Antarmuka adalah konvensi fungsional yang ditentukan untuk memenuhi panggilan eksternal, sehingga mencerminkan karakteristik eksternal dari berbagai hal
6. Antarmuka pada dasarnya tidak memiliki karakteristik pewarisan tertentu, hanya menjanjikan metode yang dapat disebut
7. Antarmuka dapat digunakan untuk mendukung callback, tetapi warisan tidak memiliki fitur ini
8. Metode spesifik yang diterapkan oleh kelas abstrak bersifat virtual secara default, tetapi metode antarmuka di kelas yang mengimplementasikan antarmuka bersifat non-virtual secara default, tentu saja, Anda juga dapat menyatakannya virtual
9. Jika kelas abstrak mengimplementasikan antarmuka, metode dalam antarmuka dapat dipetakan ke kelas abstrak sebagai metode abstrak tanpa harus mengimplementasikannya, tetapi metode dalam antarmuka dapat diimplementasikan dalam subkelas kelas abstrak
Aturan penggunaan:
1. Kelas abstrak terutama digunakan untuk objek yang terkait erat, sedangkan antarmuka paling baik digunakan untuk menyediakan fungsionalitas umum untuk kelas yang tidak relevan
2. Jika Anda ingin merancang unit fungsional yang besar, gunakan kelas abstrak; Jika Anda ingin merancang blok fungsional kecil dan ringkas, gunakan antarmuka.
3. Jika beberapa versi komponen diharapkan untuk dibuat, buat kelas abstrak. Setelah antarmuka dibuat, itu tidak dapat diubah. Jika versi baru antarmuka diperlukan, antarmuka yang sama sekali baru harus dibuat.
4. Jika fungsi yang dibuat akan digunakan di antara berbagai objek heterogen, gunakan antarmuka; Jika Anda ingin menyediakan fungsionalitas yang diterapkan umum di semua implementasi komponen, gunakan kelas abstrak.
5. Analisis objek, sempurnakan kesamaan internal untuk membentuk kelas abstrak, yang digunakan untuk mengekspresikan esensi objek, yaitu "apa". Antarmuka diprioritaskan ketika panggilan atau fungsi eksternal perlu diperluas
6. Definisi antarmuka yang baik harus spesifik dan fungsional, bukan multi-fungsi, jika tidak maka akan menyebabkan polusi antarmuka. Jika kelas hanya mengimplementasikan satu fungsi antarmuka, tetapi harus mengimplementasikan metode lain di antarmuka, itu disebut polusi antarmuka
7. Cobalah untuk menghindari penggunaan warisan untuk mencapai fungsi formasi, tetapi gunakan multiplexing kotak hitam, yaitu kombinasi objek. Karena peningkatan jumlah level warisan, konsekuensi yang paling langsung adalah ketika Anda memanggil kelas dalam takson ini, Anda harus memuat semuanya ke dalam tumpukan! Konsekuensinya bisa dibayangkan. (Dikombinasikan dengan pemahaman prinsip tumpukan). Pada saat yang sama, teman-teman yang tertarik dapat memperhatikan bahwa Microsoft sering menggunakan metode kombinasi objek saat membangun kelas. Misalnya, di asp.net, kelas Page memiliki properti seperti Permintaan Server, tetapi sebenarnya semuanya adalah objek dari kelas tertentu. Menggunakan objek kelas Page ini untuk memanggil metode dan properti kelas lain adalah prinsip desain yang sangat mendasar
Misalnya:
Formulir jendela dapat dirancang dengan kelas abstrak, dan operasi dan properti publik dapat ditempatkan di kelas abstrak, sehingga formulir dan kotak dialog dapat mewarisi dari kelas abstrak ini, dan kemudian memperluas dan meningkatkan sesuai dengan kebutuhan mereka sendiri.

Operasi cetak dapat disediakan sebagai antarmuka untuk setiap formulir yang membutuhkan fungsi ini, karena isi formulir berbeda, dan mereka harus menerapkan fungsi pencetakan mereka sendiri sesuai dengan kebutuhan mereka sendiri. Saat mencetak, itu hanya dipanggil melalui antarmuka, terlepas dari formulir mana yang dicetak.

Kesamaan, Individualitas dan Pilihan:
Beberapa buku menulis bahwa C# merekomendasikan penggunaan antarmuka alih-alih kelas dasar abstrak, dan menekankan banyak manfaat menggunakan antarmuka, yang saya tidak berani tidak setuju, dari daftar di atas, masih banyak perbedaan antara keduanya, dan keberadaan perbedaan ini harus menentukan perbedaan dalam skenario yang berlaku, misalnya, di kelas dasar abstrak dapat memberikan implementasi default untuk beberapa metode, sehingga dapat menghindari implementasi berulang di subkelas dan meningkatkan penggunaan kembali kode. Ini adalah keuntungan dari kelas abstrak; Antarmuka hanya dapat berisi metode abstrak. Adapun kapan menggunakan kelas dasar abstrak dan kapan menggunakan antarmuka, itu tergantung pada bagaimana pengguna melihat koneksi antara kelas yang diwariskan, apakah itu perbedaan kepribadian atau koneksi umum di antara mereka. Izinkan saya mengilustrasikan dengan contoh kehidupan.

Jika Anda diberi tiga objek yaitu manusia, ikan, dan katak, dan Anda diminta untuk merancang kategori dasar bagi mereka untuk merangkum hubungan di antara mereka, maka hal pertama yang akan Anda rasakan adalah bahwa ada perbedaan besar di antara mereka, dan sulit untuk mengabstraksikan kesamaannya. Di sinilah Anda harus mempertimbangkan untuk menggunakan antarmuka alih-alih kelas dasar abstrak karena tiga alasan:
1. Individualitas lebih besar daripada kesamaan.
2. Kepribadian dengan perbedaan besar memiliki beberapa perilaku yang sama.
3. Ada perbedaan besar dalam metode realisasi perilaku yang sama.
Pada saat ini, Anda diberikan tiga objek lagi, yaitu ikan mas crucian, ikan mas, dan ikan mas, dan masih membiarkan Anda merancang kelas dasar untuk meringkas hubungan di antara mereka, maka hal pertama yang Anda sadari adalah bahwa mereka semua milik ikan, dan yang kedua adalah cara mereka berenang mungkin sedikit berbeda, jadi Anda harus menggunakan kelas dasar abstrak alih-alih antarmuka, dibandingkan dengan contoh di atas, ada tiga alasan:
1. Kesamaan lebih besar daripada individualitas
2. Individu dengan kesamaan yang sama harus memiliki atribut dan perilaku yang sama
3. Ada perbedaan tertentu dalam metode implementasi perilaku yang sama
Di antara beberapa alasan untuk menggunakan antarmuka atau kelas dasar abstrak, alasan ketiga sebenarnya sama, yang menggambarkan konsep polimorfisme dalam berorientasi objek, yaitu diimplementasikan dengan mengganti kelas induk dan memanggil metode yang sesuai pada runtime sesuai dengan referensi objek yang dilewati. Alasan kedua mulai menyimpang, dengan antarmuka yang menekankan perilaku yang sama antara objek yang diwariskan, sementara kelas abstrak juga menekankan properti yang sama antara objek yang diwariskan. Apa yang benar-benar membedakan antarmuka dari kelas dasar abstrak adalah alasan berikut:

Antarmuka digunakan ketika kesamaan fungsional dicari antara objek dengan perbedaan besar.
Kelas dasar abstrak digunakan ketika perbedaan fungsional dicari antara objek dengan lebih banyak kesamaan.
Dengan membandingkan yang sama dan berbeda, kita hanya dapat mengatakan bahwa antarmuka dan kelas abstrak memiliki kekuatannya sendiri, tetapi tidak ada keuntungannya. Dalam praktik pemrograman yang sebenarnya, kita perlu mengukur bakat kita sesuai dengan situasi tertentu, tetapi pengalaman dan akumulasi berikut dapat memberi Anda beberapa inspirasi, selain beberapa akumulasi saya, banyak di antaranya berasal dari klasik, saya yakin mereka dapat bertahan dalam ujian. Jadi dalam aturan dan kesempatan, kita mempelajari klasik ini, yang terpenting adalah menerapkan apa yang telah kita pelajari, tentu saja, saya akan memenangkan tawa semua orang dengan kata-kata keluarga, silakan lanjutkan.

Aturan dan kesempatan:
1. Ingatlah bahwa salah satu prinsip terpenting dari pemikiran berorientasi objek adalah: pemrograman berorientasi antarmuka.
2. Dengan bantuan antarmuka dan kelas abstrak, banyak ide dalam 23 pola desain telah diimplementasikan dengan cerdik, dan saya pikir esensinya hanyalah bahwa mereka berorientasi pada pemrograman abstrak.
3. Kelas abstrak harus digunakan terutama untuk objek yang terkait erat, sedangkan antarmuka paling baik digunakan untuk menyediakan fungsionalitas umum untuk kelas yang tidak relevan.
4. Antarmuka berfokus pada jenis hubungan CAN-DO, sedangkan kelas abstrak berfokus pada hubungan IS-A.
5. Perilaku objek multi-definisi di antarmuka; kelas abstrak multi-mendefinisikan properti objek;
6. Definisi antarmuka dapat menggunakan pengubah publik, terlindungi, internal, dan pribadi, tetapi hampir semua antarmuka didefinisikan sebagai publik, jadi tidak perlu mengatakan lebih banyak.
7. "Antarmuka tetap tidak berubah" adalah faktor penting yang harus dipertimbangkan. Oleh karena itu, saat menambahkan ekstensi dari antarmuka, antarmuka baru harus ditambahkan, bukan antarmuka yang ada.
8. Cobalah untuk mendesain antarmuka menjadi blok fungsional dengan satu fungsi, mengambil .NET Framework sebagai contoh, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable, dll. semuanya hanya berisi satu metode umum.
9. Huruf kapital "I" di depan nama antarmuka adalah konvensi, sama seperti nama bidang yang dimulai dengan garis bawah, harap patuhi prinsip-prinsip ini.
10. Di antarmuka, semua metode default ke publik.
11. Jika masalah versi diharapkan, Anda dapat membuat "kelas abstrak". Misalnya, jika Anda membuat anjing, ayam, dan bebek, Anda harus mempertimbangkan untuk mengabstraksi hewan untuk menghadapi hal-hal yang mungkin muncul di masa depan. Menambahkan anggota baru ke antarmuka memaksa semua kelas turunan untuk dimodifikasi dan dikompilasi ulang, sehingga masalah penerapan versi paling baik diterapkan dengan kelas abstrak.
12. Kelas non-abstrak yang berasal dari kelas abstrak harus mencakup semua metode abstrak yang diwariskan dan implementasi aktual dari pengakses abstrak.
13. Kata kunci baru tidak dapat digunakan untuk kelas abstrak, juga tidak dapat disegel, karena kelas abstrak tidak dapat dibuat.
14. Pengubah statis atau virtual tidak dapat digunakan dalam deklarasi metode abstrak.





Mantan:Desain Izin Sederhana C# Enum menggunakan properti FlagsAttribute
Depan:Kelas Yiyun Huang Yong memiliki pemahaman berbasis nol tentang program mini WeChat
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com