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 ClassQuesta 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 ModuleEcco l'output:
Io opero sull'addome Io opero sull'uteroBene: 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'addomeEcco: 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!
Nessun commento:
Posta un commento