Sostituisce in VB.NET

click fraud protection

Questa è una di una mini serie che copre le differenze tra sovraccarichi, ombre e sostituzioni VB.NET. Questo articolo riguarda le sostituzioni. Gli articoli che coprono gli altri sono qui:

-> Sovraccarichi
-> Ombre

Queste tecniche può essere estremamente confuso; ci sono molte combinazioni di queste parole chiave e le opzioni di eredità sottostanti. La documentazione di Microsoft non inizia a rendere giustizia all'argomento e sul Web ci sono molte informazioni scadute o obsolete. Il miglior consiglio per essere sicuri che il programma sia codificato correttamente è "Test, test e test di nuovo". In questa serie, li vedremo uno alla volta con enfasi sulle differenze.

Sostituzioni

Ciò che accomuna Shadows, Overloads e Overrides è che riutilizzano il nome degli elementi mentre cambiano ciò che accade. Ombre e sovraccarichi possono operare sia all'interno della stessa classe che quando a la classe eredita un'altra classe. Le sostituzioni, tuttavia, possono essere utilizzate solo in una classe derivata (a volte chiamata classe figlio) che eredita da a

instagram viewer
classe base (a volte chiamato classe genitore). E Overrides è il martello; ti permette di sostituire completamente un metodo (o una proprietà) da una classe base.

Nell'articolo sulle classi e la parola chiave Shadows (Vedi: Ombre in VB.NET), è stata aggiunta una funzione per mostrare che è possibile fare riferimento a una procedura ereditata.

Contatto di classe pubblica Professional. '... codice non mostrato... Funzione pubblica HashTheName ( ByVal nm As String) As String. Ritorno nm. GetHashCode. Fine funzione. End Class.

Il codice che crea un'istanza di una classe derivata da questa (CodedProfessionalContact nell'esempio) può chiamare questo metodo perché ereditato.

Nell'esempio, ho usato VB.NET GetHashCode metodo per mantenere semplice il codice e questo ha restituito un risultato abbastanza inutile, il valore -520086483. Supponiamo di voler invece restituire un risultato diverso ma,

-> Non riesco a cambiare la classe di base. (Forse tutto ciò che ho è il codice compilato da un fornitore.)

... e ...

-> Non riesco a cambiare il codice chiamante (forse ci sono migliaia di copie e non posso aggiornarle.)

Se riesco ad aggiornare la classe derivata, posso modificare il risultato restituito. (Ad esempio, il codice potrebbe far parte di una DLL aggiornabile.)

C'è un problema Perché è così completo e potente, devi avere l'autorizzazione dalla classe base per usare Overrides. Ma le librerie di codici ben progettate lo forniscono. (Il tuo le librerie di codici sono tutte ben progettate, giusto?) Ad esempio, la funzione fornita da Microsoft che abbiamo appena usato è sostituibile. Ecco un esempio della sintassi.

Funzione pubblica sostituibile GetHashCode come numero intero

Quindi quella parola chiave deve essere presente anche nella nostra classe base di esempio.

Funzione overridable pubblica HashTheName ( ByVal nm As String) As String.

Sostituzione del metodo ora è semplice come fornirne uno nuovo con la parola chiave Overrides. Visual Studio ti dà di nuovo un punto di partenza compilando il codice per te con il completamento automatico. Quando entri ...


Funzione di sostituzione pubblica HashTheName (

Visual Studio aggiunge automaticamente il resto del codice non appena si digita la parentesi aperta, inclusa l'istruzione return che chiama solo la funzione originale dalla classe base. (Se stai solo aggiungendo qualcosa, questa è di solito una buona cosa da fare dopo l'esecuzione del tuo nuovo codice.)

Funzione di sostituzione pubblica HashTheName ( nm come stringa) come stringa. Restituisci MyBase. HashTheName (nm) Fine funzione.

In questo caso, tuttavia, sostituirò il metodo con qualcos'altro altrettanto inutile solo per illustrare come è fatto: la funzione VB.NET che invertirà la stringa.

Funzione di sostituzione pubblica HashTheName ( nm come stringa) come stringa. Restituisci Microsoft. Visual Basic. StrReverse (nm) Fine funzione.

Ora il codice chiamante ottiene un risultato completamente diverso. (Confronta con il risultato nell'articolo su Ombre.)


ContactID: 246. Nome dell'azienda: Villain Defeaters, GmbH. Hash of the BusinessName: HbmG, sretaefeD nialliV. 

Puoi anche ignorare le proprietà. Supponiamo che tu abbia deciso che valori ContactID maggiori di 123 non sarebbero consentiti e dovrebbero essere impostati su 111. Puoi semplicemente sostituire la proprietà e cambiarla quando la proprietà viene salvata:

Private _ContactID come intero. Il pubblico esegue l'override della proprietà ContactID come numero intero. Ottenere. Restituisce _ContactID. End Get. Imposta (valore ByVal come intero) Se valore> 123 Quindi. _ContactID = 111. Altro. _ContactID = valore. Finisci se. Set finale. Proprietà finale.

Quindi ottieni questo risultato quando viene passato un valore più grande:


ContactID: 111. Nome: Damsel Rescuers, LTD. 

A proposito, nel codice di esempio finora, i valori interi sono raddoppiati nel Nuovo sottoprogramma (Vedi l'articolo su Ombre), quindi un numero intero di 123 viene modificato in 246 e quindi nuovamente modificato in 111.

VB.NET ti offre, ancora di più, il controllo consentendo a una classe base di richiedere o rifiutare specificamente una classe derivata da sovrascrivere utilizzando le parole chiave MustOverride e NotOverridable nella classe base. Ma entrambi sono usati in casi abbastanza specifici. Innanzitutto, NotOverridable.

Poiché l'impostazione predefinita per una classe pubblica è NotOverridable, perché mai dovresti specificarla? Se lo provi sulla funzione HashTheName nella classe base, otterrai un errore di sintassi, ma il testo del messaggio di errore ti dà un indizio:

Non è possibile specificare "NotOverridable" per i metodi che non sostituiscono un altro metodo.

L'impostazione predefinita per un metodo override è esattamente l'opposto: Overrideable. Quindi, se si desidera interrompere definitivamente qui, è necessario specificare NotOverridable su quel metodo. Nel nostro codice di esempio:


Public NotOverridable Sostituzioni Funzione HashTheName (... 

Quindi se la classe CodedProfessionalContact è, a sua volta, ereditata ...


Classe pubblica NotOverridableEx. Eredita CodedProfessionalContact. 

... la funzione HashTheName non può essere sostituita in quella classe. Un elemento che non può essere ignorato viene talvolta chiamato elemento sigillato.

Una parte fondamentale di il .Fondazione NET è richiedere che lo scopo di ogni classe sia esplicitamente definito per rimuovere ogni incertezza. Un problema nei precedenti linguaggi OOP è stato chiamato "la fragile classe base". Questo succede quando una base La classe aggiunge un nuovo metodo con lo stesso nome del nome di un metodo in una sottoclasse che eredita da una base classe. Il programmatore che scrive la sottoclasse non ha intenzione di sovrascrivere la classe base, ma è esattamente quello che succede comunque. Questo è noto per provocare il grido del programmatore ferito, "Non ho cambiato nulla, ma il mio programma si è bloccato comunque. "Se esiste la possibilità che una classe venga aggiornata in futuro e crei questo problema, dichiaralo come NotOverridable.

MustOverride è spesso usato in quella che viene chiamata una classe astratta. (In C #, la stessa cosa usa la parola chiave Abstract!) Questa è una classe che fornisce solo un modello e ci si aspetta che lo riempia con il proprio codice. Microsoft fornisce questo esempio di uno:

Lavatrice pubblica MustInherit Class. Sub Nuovo () 'Il codice per creare un'istanza della classe va qui. End sub. Public MustOverride Sub Wash. Public MustOverride Sub Rinse (loadSize as Integer) Funzione pubblica MustOverride Centrifuga (velocità come numero intero) come lunga. End Class.

Per continuare l'esempio di Microsoft, le lavatrici faranno queste cose (Wash, Risciacquo e Centrifuga) in modo abbastanza diverso, quindi non c'è alcun vantaggio nel definire la funzione nella classe base. Ma c'è un vantaggio nell'assicurarsi che qualsiasi classe erediti questa fa definirli. La soluzione: una classe astratta.

Se hai bisogno di ulteriori spiegazioni sulle differenze tra sovraccarichi e sostituzioni, in un suggerimento rapido viene sviluppato un esempio completamente diverso: sovraccarichi e sostituzioni

VB.NET ti offre un controllo ancora maggiore consentendo a una classe base di richiedere o negare in modo specifico una classe derivata da sostituire utilizzando le parole chiave MustOverride e NotOverridable nella classe base. Ma entrambi sono usati in casi abbastanza specifici. Innanzitutto, NotOverridable.

Poiché l'impostazione predefinita per una classe pubblica è NotOverridable, perché mai dovresti specificarla? Se lo provi sulla funzione HashTheName nella classe base, otterrai un errore di sintassi, ma il testo del messaggio di errore ti dà un indizio:

Non è possibile specificare "NotOverridable" per i metodi che non sostituiscono un altro metodo.

L'impostazione predefinita per un metodo override è esattamente l'opposto: Overrideable. Quindi, se si desidera interrompere definitivamente qui, è necessario specificare NotOverridable su quel metodo. Nel nostro codice di esempio:


Public NotOverridable Sostituzioni Funzione HashTheName (... 

Quindi se la classe CodedProfessionalContact è, a sua volta, ereditata ...


Classe pubblica NotOverridableEx. Eredita CodedProfessionalContact. 

... la funzione HashTheName non può essere sostituita in quella classe. Un elemento che non può essere ignorato viene talvolta chiamato elemento sigillato.

Una parte fondamentale di .NET Foundation è richiedere che lo scopo di ogni classe sia esplicitamente definito per rimuovere tutte le incertezze. Un problema nei precedenti linguaggi OOP è stato chiamato "la fragile classe base". Questo succede quando una base La classe aggiunge un nuovo metodo con lo stesso nome del nome di un metodo in una sottoclasse che eredita da una base classe. Il programmatore che scrive la sottoclasse non ha intenzione di sovrascrivere la classe base, ma è esattamente quello che succede comunque. Questo è noto per provocare il grido del programmatore ferito, "Non ho cambiato nulla, ma il mio programma si è bloccato comunque. "Se esiste la possibilità che una classe venga aggiornata in futuro e crei questo problema, dichiaralo come NotOverridable.

MustOverride è spesso usato in quella che viene chiamata una classe astratta. (In C #, la stessa cosa usa la parola chiave Abstract!) Questa è una classe che fornisce solo un modello e ci si aspetta che lo riempia con il proprio codice. Microsoft fornisce questo esempio di uno:

Lavatrice pubblica MustInherit Class. Sub Nuovo () 'Il codice per creare un'istanza della classe va qui. End sub. Public MustOverride Sub Wash. Public MustOverride Sub Rinse (loadSize as Integer) Funzione pubblica MustOverride Centrifuga (velocità come numero intero) come lunga. End Class.

Per continuare l'esempio di Microsoft, le lavatrici faranno queste cose (Wash, Risciacquo e Centrifuga) in modo abbastanza diverso, quindi non c'è alcun vantaggio nel definire la funzione nella classe base. Ma c'è un vantaggio nell'assicurarsi che qualsiasi classe erediti questa fa definirli. La soluzione: una classe astratta.

Se hai bisogno di ulteriori spiegazioni sulle differenze tra sovraccarichi e sostituzioni, in un suggerimento rapido viene sviluppato un esempio completamente diverso: sovraccarichi e sostituzioni

instagram story viewer