Mengganti dalam VB.NET

Ini adalah salah satu dari seri-mini yang mencakup perbedaan dalam Kelebihan, Bayangan, dan Overrid dalam VB.NET. Artikel ini mencakup Overrides. Artikel yang membahas yang lain ada di sini:

-> Kelebihan
-> Bayangan

Teknik-teknik ini bisa sangat membingungkan; ada banyak kombinasi kata kunci ini dan opsi pewarisan yang mendasarinya. Dokumentasi Microsoft sendiri tidak mulai melakukan keadilan topik dan ada banyak informasi yang buruk, atau ketinggalan zaman di web. Saran terbaik untuk memastikan bahwa program Anda dikodekan dengan benar adalah, "Uji, uji, dan uji lagi." Dalam seri ini, kita akan melihat mereka satu per satu dengan penekanan pada perbedaan.

Mengganti

Kesamaan yang dimiliki Shadows, Overloads, dan Overrides adalah mereka menggunakan kembali nama elemen sambil mengubah apa yang terjadi. Bayangan dan Kelebihan dapat beroperasi baik di dalam kelas yang sama atau ketika a mewarisi kelas kelas lain. Mengesampingkan, bagaimanapun, hanya dapat digunakan dalam kelas turunan (kadang-kadang disebut kelas anak) yang diwarisi dari a

instagram viewer
kelas dasar (terkadang disebut kelas induk). Dan Overrides adalah palu; itu memungkinkan Anda sepenuhnya mengganti metode (atau properti) dari kelas dasar.

Dalam artikel tentang kelas dan kata kunci Bayangan (Lihat: Bayangan di VB.NET), fungsi ditambahkan untuk menunjukkan bahwa prosedur yang diwarisi dapat dirujuk.

Public Class ProfessionalContact. '... kode tidak ditampilkan... Fungsi Publik HashTheName ( ByVal nm As String) As String. Kembali nm. GetHashCode. Fungsi Akhir. Kelas Akhir.

Kode yang instantiates kelas yang berasal dari yang ini (CodedProfessionalContact dalam contoh) dapat memanggil metode ini karena itu diwarisi.

Dalam contoh, saya menggunakan VB.NET GetHashCode metode untuk menjaga kode sederhana dan ini mengembalikan hasil yang cukup berguna, nilai -520086483. Misalkan saya ingin hasil yang berbeda dikembalikan tetapi,

-> Saya tidak bisa mengubah kelas dasar. (Mungkin semua yang saya miliki adalah kode yang dikompilasi dari vendor.)

... dan ...

-> Saya tidak dapat mengubah kode panggilan (Mungkin ada seribu salinan dan saya tidak dapat memperbaruinya.)

Jika saya dapat memperbarui kelas turunan, maka saya dapat mengubah hasil yang dikembalikan. (Misalnya, kode dapat menjadi bagian dari DLL yang dapat diperbarui.)

Ada satu masalah. Karena sangat komprehensif dan kuat, Anda harus memiliki izin dari kelas dasar untuk menggunakan Override. Tapi perpustakaan kode yang dirancang dengan baik menyediakannya. (Anda pustaka kode semuanya dirancang dengan baik, bukan?) Misalnya, fungsi yang disediakan Microsoft yang baru saja kita gunakan bisa ditimpa. Berikut ini contoh sintaksnya.

Fungsi Overridable Publik GetHashCode Sebagai Integer

Jadi kata kunci itu harus ada di kelas dasar contoh kita juga.

Fungsi Overridable Publik HashTheName ( ByVal nm As String) As String.

Mengganti metode sekarang sesederhana memberikan yang baru dengan kata kunci Override. Visual Studio lagi memberi Anda mulai menjalankan dengan mengisi kode untuk Anda dengan AutoComplete. Saat Anda masuk ...


Fungsi Override Publik HashTheName (

Visual Studio menambahkan sisa kode secara otomatis segera setelah Anda mengetik tanda kurung buka, termasuk pernyataan kembali yang hanya memanggil fungsi asli dari kelas dasar. (Jika Anda hanya menambahkan sesuatu, ini biasanya hal yang baik untuk dilakukan setelah kode baru Anda dijalankan.)

Fungsi Override Publik HashTheName ( nm As String) As String. Kembalikan MyBase. HashTheName (nm) Fungsi Akhir.

Namun dalam kasus ini, saya akan mengganti metode dengan sesuatu yang sama tidak berguna hanya untuk menggambarkan bagaimana hal itu dilakukan: Fungsi VB.NET yang akan membalikkan string.

Fungsi Override Publik HashTheName ( nm As String) As String. Kembalikan Microsoft. Dasar visual. StrReverse (nm) Fungsi Akhir.

Sekarang kode panggilan mendapat hasil yang sama sekali berbeda. (Bandingkan dengan hasil di artikel tentang Bayangan.)


Hubungi ID: 246. BusinessName: Penjahat Penjahat, GmbH. Hash of the BusinessName: HbmG, sretaefeD nialliV. 

Anda juga dapat menimpa properti. Misalkan Anda memutuskan bahwa nilai-nilai ContactID lebih dari 123 tidak akan diizinkan dan seharusnya default ke 111. Anda bisa mengganti properti dan mengubahnya ketika properti disimpan:

Pribadi _ContactID Sebagai Integer. Public Overrides Property ContactID Sebagai Integer. Dapatkan. Kembalikan _ContactID. End Get. Set (Nilai ByVal Sebagai Integer) Jika nilai> 123 Lalu. _ContactID = 111. Lain. _ContactID = nilai. Berakhir jika. Set Akhir. Akhiri Properti.

Kemudian Anda mendapatkan hasil ini ketika nilai yang lebih besar diteruskan:


Hubungi ID: 111. BusinessName: Damsel Rescuers, LTD. 

By the way, dalam kode contoh sejauh ini, nilai integer digandakan di New subrutin (Lihat artikel tentang Bayangan), jadi bilangan bulat 123 diubah menjadi 246 dan kemudian diubah lagi menjadi 111.

VB.NET memberi Anda, lebih banyak lagi, kontrol dengan mengizinkan kelas dasar untuk secara khusus membutuhkan atau menolak kelas turunan untuk menimpa menggunakan kata kunci MustOverride dan NotOverridable di kelas dasar. Namun keduanya digunakan dalam kasus yang cukup spesifik. Pertama, NotOverridable.

Karena standar untuk kelas publik adalah NotOverridable, mengapa Anda harus menetapkannya? Jika Anda mencobanya pada fungsi HashTheName di kelas dasar, Anda mendapatkan kesalahan sintaks, tetapi teks pesan kesalahan memberi Anda petunjuk:

'NotOverridable' tidak dapat ditentukan untuk metode yang tidak mengabaikan metode lain.

Default untuk metode yang diganti hanya kebalikannya: Dapat ditimpa. Jadi jika Anda ingin mengganti pasti berhenti di sana, Anda harus menentukan NotOverridable pada metode itu. Dalam kode contoh kami:


Public NotOverridable Mengganti Function HashTheName (... 

Kemudian jika kelas CodedProfessionalContact, pada gilirannya, diwarisi ...


Kelas Publik NotOverridableEx. Mewarisi CodedProfessionalContact. 

... fungsi HashTheName tidak dapat diganti dalam kelas itu. Suatu elemen yang tidak dapat ditimpa kadang-kadang disebut elemen tersegel.

Bagian mendasar dari itu.Yayasan NET adalah untuk mengharuskan tujuan setiap kelas secara eksplisit didefinisikan untuk menghapus semua ketidakpastian. Masalah dalam bahasa OOP sebelumnya telah disebut "kelas dasar rapuh." Ini terjadi ketika sebuah pangkalan kelas menambahkan metode baru dengan nama yang sama dengan nama metode di subkelas yang mewarisi dari basis kelas. Programmer yang menulis subclass tidak berencana untuk mengesampingkan kelas dasar, tetapi inilah yang sebenarnya terjadi. Hal ini diketahui menyebabkan teriakan programmer yang terluka, "Saya tidak mengubah apa pun, tetapi program saya macet "Jika ada kemungkinan suatu kelas akan diperbarui di masa depan dan membuat masalah ini, nyatakan sebagai Tidak dapat dimasuki.

MustOverride paling sering digunakan dalam apa yang disebut Kelas Abstrak. (Dalam C #, hal yang sama menggunakan kata kunci Abstrak!) Ini adalah kelas yang hanya menyediakan template dan Anda diharapkan untuk mengisinya dengan kode Anda sendiri. Microsoft memberikan contoh ini:

Mesin Pencuci Kelas MustInherit Publik. Sub Baru () 'Kode untuk membuat instance kelas ada di sini. End sub. Public MustOverride Sub Wash. Public MustOverride Sub Rinse (loadSize sebagai Integer) Fungsi MustOverride Publik Berputar (kecepatan sebagai Integer) Selama. Kelas Akhir.

Untuk melanjutkan contoh Microsoft, mesin cuci akan melakukan hal-hal ini (Cuci, Bilas, dan Putar) dengan sangat berbeda, sehingga tidak ada keuntungan dari mendefinisikan fungsi di kelas dasar. Tetapi ada keuntungan dalam memastikan bahwa setiap kelas yang mewarisi yang satu ini tidak mendefinisikannya. Solusinya: kelas abstrak.

Jika Anda memerlukan lebih banyak penjelasan tentang perbedaan antara Overload dan Overrides, contoh yang sama sekali berbeda dikembangkan dalam Tip Cepat: Overloads vs. Overrides

VB.NET memberi Anda kontrol lebih besar lagi dengan memungkinkan kelas dasar secara khusus membutuhkan atau menolak kelas turunan untuk menimpa menggunakan kata kunci MustOverride dan NotOverridable di kelas dasar. Namun keduanya digunakan dalam kasus yang cukup spesifik. Pertama, NotOverridable.

Karena standar untuk kelas publik adalah NotOverridable, mengapa Anda harus menetapkannya? Jika Anda mencobanya pada fungsi HashTheName di kelas dasar, Anda mendapatkan kesalahan sintaks, tetapi teks pesan kesalahan memberi Anda petunjuk:

'NotOverridable' tidak dapat ditentukan untuk metode yang tidak mengabaikan metode lain.

Default untuk metode yang diganti hanya kebalikannya: Dapat ditimpa. Jadi jika Anda ingin mengganti pasti berhenti di sana, Anda harus menentukan NotOverridable pada metode itu. Dalam kode contoh kami:


Public NotOverridable Mengganti Function HashTheName (... 

Kemudian jika kelas CodedProfessionalContact, pada gilirannya, diwarisi ...


Kelas Publik NotOverridableEx. Mewarisi CodedProfessionalContact. 

... fungsi HashTheName tidak dapat diganti dalam kelas itu. Suatu elemen yang tidak dapat ditimpa kadang-kadang disebut elemen tersegel.

Bagian mendasar dari .NET Foundation adalah mensyaratkan bahwa tujuan setiap kelas didefinisikan secara eksplisit untuk menghapus semua ketidakpastian. Masalah dalam bahasa OOP sebelumnya telah disebut "kelas dasar rapuh." Ini terjadi ketika sebuah pangkalan kelas menambahkan metode baru dengan nama yang sama dengan nama metode di subkelas yang mewarisi dari basis kelas. Programmer yang menulis subclass tidak berencana untuk mengesampingkan kelas dasar, tetapi inilah yang sebenarnya terjadi. Hal ini diketahui menyebabkan teriakan programmer yang terluka, "Saya tidak mengubah apa pun, tetapi program saya macet "Jika ada kemungkinan suatu kelas akan diperbarui di masa depan dan membuat masalah ini, nyatakan sebagai Tidak dapat dimasuki.

MustOverride paling sering digunakan dalam apa yang disebut Kelas Abstrak. (Dalam C #, hal yang sama menggunakan kata kunci Abstrak!) Ini adalah kelas yang hanya menyediakan template dan Anda diharapkan untuk mengisinya dengan kode Anda sendiri. Microsoft memberikan contoh ini:

Mesin Pencuci Kelas MustInherit Publik. Sub Baru () 'Kode untuk membuat instance kelas ada di sini. End sub. Public MustOverride Sub Wash. Public MustOverride Sub Rinse (loadSize sebagai Integer) Fungsi MustOverride Publik Berputar (kecepatan sebagai Integer) Selama. Kelas Akhir.

Untuk melanjutkan contoh Microsoft, mesin cuci akan melakukan hal-hal ini (Cuci, Bilas, dan Putar) dengan sangat berbeda, sehingga tidak ada keuntungan dari mendefinisikan fungsi di kelas dasar. Tetapi ada keuntungan dalam memastikan bahwa setiap kelas yang mewarisi yang satu ini tidak mendefinisikannya. Solusinya: kelas abstrak.

Jika Anda memerlukan lebih banyak penjelasan tentang perbedaan antara Overload dan Overrides, contoh yang sama sekali berbeda dikembangkan dalam Tip Cepat: Overloads vs. Overrides

instagram story viewer