Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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()

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
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: 1792
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.

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

PM Quote