Bene.
Abbiamo un IDE vergine, applicazione tipo console.
Cominciamo con il creare una classe Medico, che sarebbe il medico generico.
Class Medico
Sub visita()
Console.WriteLine("Visito il paziente")
End Sub
Sub prescrivi()
Console.WriteLine("Prescrivo una terapia farmacologica")
End Sub
End Class
Questa
non può essere una classe astratta, in quanto il medico generico, che visita e prescrive una terapia,
esiste realmente.
Adesso creiamo un'interfaccia Chirurgo.
Interface Chirurgo
Sub opera()
Sub sutura()
End Interface
Il medico generico non implementa l'interfaccia (un po' ridicola perchè operare e suturare non sono due cose realmente separate, ma le ho distinte giusto per non creare un'interfaccia con un solo metodo).
Adesso creiamo una classe derivata ChirurgoGenerale e una classe derivata Ginecologo, che implementano l'interfaccia Chirurgo.
Class ChirurgoGenerale
Inherits Medico
Implements Chirurgo
Public Sub opera() Implements Chirurgo.opera
Console.WriteLine("Io opero sull'addome")
End Sub
Public Sub sutura() Implements Chirurgo.sutura
Console.WriteLine("Io suturo la parete addominale")
End Sub
End Class
Class Ginecologo
Inherits Medico
Implements Chirurgo
Public Sub opera() Implements Chirurgo.opera
Console.WriteLine("Io opero sull'utero")
End Sub
Public Sub sutura() Implements Chirurgo.sutura
Console.WriteLine("Io suturo la pelvi delle pazienti")
End Sub
End Class
Bene.
Adesso istanzio un oggetto Chirurgo, che sia un Chirurgo Generale, e uno che sia un Ginecologo.
Module Module1
Sub Main()
Dim mioChirurgo As Chirurgo = New ChirurgoGenerale
Dim mioGinecologo As Chirurgo = New Ginecologo
mioChirurgo.opera()
mioGinecologo.opera()
Console.ReadKey()
End Sub
End Module
Ecco l'output:
Io opero sull'addome
Io opero sull'utero
Bene: io ho definito l'oggetto istanziato come
Chirurgo anche se in un caso si tratta di Chirurgo Generale e nell'altro di Ginecologo.
Quello che mi serve è una funzione da chirurgo, che ogni oggetto istanziato esegue, sia pure con le competenze specialistiche dell'uno e dell'altro.
Adesso provo a far eseguire al Chirurgo Generale il metodo
Visita definito nella classe
Medico.
Module Module1
Sub Main()
Dim mioChirurgo As Chirurgo = New ChirurgoGenerale
Dim mioGinecologo As Chirurgo = New Ginecologo
mioChirurgo.opera()
mioGinecologo.opera()
Console.WriteLine()
mioChirurgo.visita
Console.ReadKey()
End Sub
End Module
Ottengo una segnalazione di errore nella fase di scrittura del codice (intercettato dall'IDE). L'errore è "Errore 1 'visita' non è un membro di 'ConsoleApplication1.Chirurgo'."
Certo! Perchè a me serve un'interfaccia Chirurgo, per cui anche se il chirurgo generale è perfettamente in grado di visitare, non è quella la funzione che mi serve, avendo dichiarato l'oggetto come interfaccia Chirurgo!
Se invece adesso dichiaro l'oggetto istanziato come ChirurgoGenerale, ossia se mi servono funzioni del Chirurgo Generale che non sono "chirurgiche", ossia implementate dall'interfaccia Chirurgo, posso benissimo far visitare un paziente dal chirurgo.
Module Module1
Sub Main()
Dim mioChirurgo As Chirurgo = New ChirurgoGenerale
Dim mioGinecologo As Chirurgo = New Ginecologo
mioChirurgo.opera()
mioGinecologo.opera()
Console.WriteLine()
Dim altroChirurgo As ChirurgoGenerale = New ChirurgoGenerale
altroChirurgo.visita()
altroChirurgo.opera()
Console.ReadKey()
End Sub
End Module
Io opero sull'addome
Io opero sull'utero
Visito il paziente
Io opero sull'addome
Ecco: così il chirurgo può eseguire sia le sue funzioni specialistiche sia le funzioni da medico generico ereditate dalla classe base Medico.
Ancora, però, posso istanziare l'oggetto dichiarandolo come Medico, in quanto mi servono solo le funzioni da medico generico, riferendomi alla classe base, non alla classe derivata, in quanto un chirurgo è comunque un medico generico prima di tutto:
Sub Main()
Dim mioChirurgo As Chirurgo = New ChirurgoGenerale
Dim mioGinecologo As Chirurgo = New Ginecologo
mioChirurgo.opera()
mioGinecologo.opera()
Console.WriteLine()
Dim altroChirurgo As ChirurgoGenerale = New ChirurgoGenerale
altroChirurgo.visita()
altroChirurgo.opera()
Console.WriteLine()
Dim nuovoChirurgo As Medico = New ChirurgoGenerale
nuovoChirurgo.visita()
Console.ReadKey()
End Sub
End Module
Io opero sull'addome
Io opero sull'utero
Visito il paziente
Io opero sull'addome
Visito il paziente
...ma adesso non posso avere una funzione specialistica da questo oggetto, in quanto ho preso il chirurgo nell'accezione di medico generico:
Module Module1
Sub Main()
Dim mioChirurgo As Chirurgo = New ChirurgoGenerale
Dim mioGinecologo As Chirurgo = New Ginecologo
mioChirurgo.opera()
mioGinecologo.opera()
Console.WriteLine()
Dim altroChirurgo As ChirurgoGenerale = New ChirurgoGenerale
altroChirurgo.visita()
altroChirurgo.opera()
Console.WriteLine()
Dim nuovoChirurgo As Medico = New ChirurgoGenerale
nuovoChirurgo.visita()
nuovoChirurgo.opera()
Console.ReadKey()
End Sub
End Module
Ottengo l'errore in fase di scrittura del codice: "Errore 1 'opera' non è un membro di 'ConsoleApplication1.Medico'.
Come mi aspettavo!