Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Overrides sovrascrive o aggiunge?
Forum - C# / VB.NET - Overrides sovrascrive o aggiunge?

Avatar
bruno.demarini (Normal User)
Pro


Messaggi: 84
Iscritto: 22/03/2010

Segnala al moderatore
Postato alle 18:55
Martedì, 26/04/2011
Ciao a tutti, non riesco a capire una cosa. Ho due semplicissime classi:
Codice sorgente - presumibilmente VB.NET

  1. Public Class Class1
  2.     Public Overridable Sub Scrivi()
  3.         MsgBox("La gallina")
  4.     End Sub
  5. End Class
  6. Public Class Class2
  7.     Inherits Class1
  8.     Public Overrides Sub Scrivi()
  9.         MsgBox("non è un animale")
  10.     End Sub
  11. End Class



Class2 eredita da Class1.
Nel form predispongo un Button1 dal seguente Click:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As     System.EventArgs) Handles Button1.Click
  2.         Dim X As New Class2
  3.         X.Scrivi()
  4.     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.

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 20:06
Martedì, 26/04/2011
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()


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Segnala al moderatore
Postato alle 20:18
Martedì, 26/04/2011
EDIT:
avevo lasciato la finestra di reply aperta quindi non ho potuto vedere la risposta di lorenzo, segui il suo metodo che è sicuramente migliore :k:

Ultima modifica effettuata da Question il 26/04/2011 alle 21:33


Ma ovviamente x64
PM Quote
Avatar
bruno.demarini (Normal User)
Pro


Messaggi: 84
Iscritto: 22/03/2010

Segnala al moderatore
Postato alle 21:12
Martedì, 26/04/2011
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. :)

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 21:45
Martedì, 26/04/2011
Testo quotato

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.


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:23
Mercoledì, 27/04/2011
Testo quotato

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".


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote