JavascriptProva

martedì 6 agosto 2013

Medici e chirurghi: un esempio di uso di ereditarietà e interfacce in VB.NET.

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!

Nessun commento:

Posta un commento