JavascriptProva

giovedì 1 agosto 2013

Override: l'esempio delle figure geometriche.

Dovrei ricordare agevolmente come si scrive il codice di un membro overridable.
Ci provo...

L'esempio che mi viene in mente è piuttosto calzante.
Class Triangolo
    Private base As Integer
    Private altezza As Integer

    Sub New(ByVal b As Integer, ByVal a As Integer)
        base = b
        altezza = a
    End Sub

    Sub calcolaArea()
        Console.WriteLine(base * altezza / 2)
        Console.ReadKey()
    End Sub
End Class
Ecco: ho costruito una classe Triangolo, che ha come proprietà Private base e altezza, che vengono definite all'atto dell'istanziazione della figura per mezzo del costruttore.
Il metodo calcolaArea restituisce il valore dell'area secondo la formula per il calcolo dell'area di un triangolo.
10


Elementare, da un punto di vista matematico.
Tuttavia questo esempiuccio ridicolo offre una serie di sviluppi...

Intanto, istanziamo diversi triangoli di diverse misure.
    Sub Main()
        Dim figura As New Triangolo(5, 4)
        figura.calcolaArea()

        Dim figura2 As New Triangolo(6, 7)
        figura2.calcolaArea()

        Dim figura3 As New Triangolo(3, 6)
        figura3.calcolaArea()


    End Sub
10
21
9


e ci sbizzarriamo a volonta...
Ma adesso facciamo qualcosa di più interessante...

Module Module1

    Sub Main()
        Dim figura As New Triangolo(5, 4)
        Console.WriteLine(figura.Area)
        Console.ReadKey()

    End Sub

End Module

Class Triangolo
    Private base As Integer
    Private altezza As Integer

    Sub New(ByVal b As Integer, ByVal a As Integer)
        base = b
        altezza = a
    End Sub

    Function Area() As Integer
        Return base * altezza / 2
    End Function
End Class
Ecco qua. Anzichè un metodo che metta a video il risultato del calcolo dell'area, è più serio creare una function che restituisca il valore dell'area, che può poi essere messa a video o usata in qualsiasi altro modo...
10



Ora creiamo una classe Rettangolo!
Class Rettangolo
    Inherits Triangolo
    Sub New(ByVal b As Integer, ByVal a As Integer)
        MyBase.new(b, a)
    End Sub

    Overrides Function Area() As Integer
        Return base * altezza
    End Function

End Class
Dato che i costruttori con parametri non si ereditano, devo scrivere esplicitamente il costruttore e richiamare il corrispondente costruttore della classe base.
Specifico Overrides dietro a Function.
Ma devo fare tutta una serie di modifiche alla classe base.
Class Triangolo
    Protected base As Integer
    Protected altezza As Integer

    Sub New(ByVal b As Integer, ByVal a As Integer)
        base = b
        altezza = a
    End Sub

    Overridable Function Area() As Integer
        Return base * altezza / 2
    End Function
End Class
  • dichiarare Protected le proprietà, altrimenti la classe derivata non le vede;
  • dichiarare Overridable la function.
Adesso provo a istanziare.
Sub Main()
        Dim mioTriangolo As New Triangolo(5, 4)
        Console.WriteLine(mioTriangolo.Area)
        Console.ReadKey()

        Dim mioRettangolo As New Rettangolo(5, 4)
        Console.WriteLine(mioRettangolo.Area)
        Console.ReadKey()

End Sub
10
20


Perfetto!

Ma adesso sorge un dubbio: Perchè un Rettangolo dovrebbe essere una classe derivata da un Triangolo???

Nessun commento:

Posta un commento