Oppure

Loading
26/04/11 16:55
bruno.demarini
Ciao a tutti, non riesco a capire una cosa. Ho due semplicissime classi:
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:

  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.
aaa
26/04/11 18:06
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()
aaa
26/04/11 18:18
Question
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 26/04/11 19:33
aaa
26/04/11 19:12
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. :)
aaa
26/04/11 19:45
TheKaneB
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.
aaa
27/04/11 13:23
Il Totem
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".
aaa