bruno.demarini (Normal User)
Pro
Messaggi: 84
Iscritto: 22/03/2010
|
Ciao a tutti, non riesco a capire una cosa. Ho due semplicissime classi:
Codice sorgente - presumibilmente VB.NET |
Public Class Class1 Public Overridable Sub Scrivi() MsgBox("La gallina") End Sub End Class Public Class Class2 Inherits Class1 Public Overrides Sub Scrivi() MsgBox("non è un animale") End Sub End Class
|
Class2 eredita da Class1.
Nel form predispongo un Button1 dal seguente Click:
Codice sorgente - presumibilmente VB.NET |
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim X As New Class2 X.Scrivi() End Sub
|
Poiché i metodi sono virtuali e non astratti, mi aspetto che l'implementazione aggiuntiva nella Class2 vada ad AGGIUNGERSI all'implementazione nella Class1, attendendomi che al click del Button1 escano due messaggi, uno dopo l'altro, cioé "La gallina", e poi "non è un animale".
Invece esce solo "non è un animale". Cosa devo modificare affinché escano entrambi? Cioè che Overrides non sovrascriva ma aggiunga? Grazie mille. |
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
forse non hai ben chiaro il concetto di overload.
Un overload al metodo non AGGIUNGE NULLA al metodo, anzi lo SOVRASCRIVE per dirla breve e terra terra. Serve appunto per modificare il comportamento di un metodo in caso di ereditarietà.
Se vuoi che venga eseguito anche il codice del metodo base devi aggiungere come prima riga del nuovo metodo il codice:
MyBase.Scrivi()
|
|
Question (Normal User)
Rookie
Messaggi: 58
Iscritto: 14/12/2010
|
EDIT:
avevo lasciato la finestra di reply aperta quindi non ho potuto vedere la risposta di lorenzo, segui il suo metodo che è sicuramente migliore
Ultima modifica effettuata da Question il 26/04/2011 alle 21:33 |
|
bruno.demarini (Normal User)
Pro
Messaggi: 84
Iscritto: 22/03/2010
|
Grazie ad entrambi per le risposte.
In realtà ero abituato a Delphi, il quale "vede" l'override come una rifinitura del metodo (e non una ridefinizione), difatti nel momento in cui erediti dalla classe base, automaticamente il nuovo metodo eredita tutto il contenuto del vecchio metodo (tramite la keyword inherited) e in più si può aggiungere (in caso contrario, si può comunque eliminare il codice ereditato e ridefinire la routine).
Il modo MyBase.Scrivi(), subito prima dell'aggiunta mi sembra ottimo. Grazie, ciao.
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
Postato originariamente da bruno.demarini:
Grazie ad entrambi per le risposte.
In realtà ero abituato a Delphi, il quale "vede" l'override come una rifinitura del metodo (e non una ridefinizione), difatti nel momento in cui erediti dalla classe base, automaticamente il nuovo metodo eredita tutto il contenuto del vecchio metodo (tramite la keyword inherited) e in più si può aggiungere (in caso contrario, si può comunque eliminare il codice ereditato e ridefinire la routine).
Il modo MyBase.Scrivi(), subito prima dell'aggiunta mi sembra ottimo. Grazie, ciao. |
vedi che il delphi funziona esattamente come il .Net per quanto riguarda l'ereditarietà (e anche come il Java, il C++ e quasi qualsiasi altro linguaggio OO). Probabilmente hai solo un po' di confusione riguardo l'OOP. |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Postato originariamente da lorenzo:
forse non hai ben chiaro il concetto di overload.
Un overload al metodo non AGGIUNGE NULLA al metodo, anzi lo SOVRASCRIVE per dirla breve e terra terra. Serve appunto per modificare il comportamento di un metodo in caso di ereditarietà.
Se vuoi che venga eseguito anche il codice del metodo base devi aggiungere come prima riga del nuovo metodo il codice:
MyBase.Scrivi() |
Questo non è un overload. Gli overload di un metodo sono versioni alternative del metodo con signature differenti (come i Console.WriteLine, definiti per ogni tipo di dato atomico).
Si tratta invece di polimorfismo o, se vuoi, overriding.
P.S.: La stessa parola "overrides" dovrebbe far intuire che è una "sovrascrittura". |
|