JavascriptProva

mercoledì 12 settembre 2012

Creazione di classi derivate, funzioni template e prima realizzazione del calendario.

Ora mi devo cimentare a creare dei derivati di Label, funzione specifica di VB.NET che VB6 si sognava beatamente.
Ereditarietà!!!

Class Casella
    Inherits Label

End Class
Bene.
Praticamente a questo punto si chiama casella ma è praticamente ancora una Label.
Sostituisco Casella a Label nel codice.
    Sub disponiCaselle(ByVal larghezza As Integer, ByVal sinistra As Integer)
        Dim numero As Integer
        numero = DateTime.DaysInMonth(anno, mese)
        Dim cas As Casella
        For n = 0 To numero - 1
            cas = New Casella
            With cas
                .BorderStyle = BorderStyle.FixedSingle
                .BackColor = Color.White
                .Width = larghezza
                .Left = sinistra
                .Top = .Height * (n Mod numero)
                .Text = GiornoDellaSettimana(CDate(n + 1 & "/" & mese & "/" & anno))
            End With
            Me.Controls.Add(cas)
        Next
    End Sub
E ovviamente funziona ancora.

E' possibile aggiungervi delle proprietà?

Provo...

Ecco la mia caselluccia: forte di esperienze già fatte, ho fatto in modo che il codice dapprima imposti la sua proprietà pubblica testo, quindi inneschi il suo metodo Scrivi per fare apparire sulla casella il testo.
Class Casella
    Inherits Label
    Public testo As String
    Sub Scrivi()
        Text = testo
    End Sub
End Class
Ed ecco il codice che la usa:
    Sub disponiCaselle(ByVal larghezza As Integer, ByVal sinistra As Integer)
        Dim numero As Integer
        numero = DateTime.DaysInMonth(anno, mese)
        Dim cas As Casella
        For n = 0 To numero - 1
            cas = New Casella
            With cas
                .BorderStyle = BorderStyle.FixedSingle
                .BackColor = Color.White
                .Width = larghezza
                .Left = sinistra
                .Top = .Height * (n Mod numero)
                .testo = GiornoDellaSettimana(CDate(n + 1 & "/" & mese & "/" & anno))
                .Scrivi()
            End With
            Me.Controls.Add(cas)
        Next
    End Sub


Bene. Adesso voglio fare in modo che sia in qualche modo "passato come parametro" anche il tipo di controllo sul quale deve agire la subroutine disponicaselle.
Ricordo che si deve usare una funzione template o generica, con la parola chiave Of.
Ricordiamo...

In pratica, mi serve una subroutine che agisca con diverse classi di oggetti, in quanto devo poterla usare con una classe o con una classe derivata della prima...

Ecco rinfrescata la memoria.
Si deve mettere As New dopo la Of seguita dalla variabile, e bisogna dichiarare la variabile oggetto As Object.
Ecco:
    Sub disponiCaselle(Of T As New)(ByVal larghezza As Integer, ByVal sinistra As Integer)
        Dim numero As Integer
        numero = DateTime.DaysInMonth(anno, mese)
        Dim cas As Object
        For n = 0 To numero - 1
            cas = New T
Ora posso creare una sottoclasse di Label per la seconda colonna...
Ecco i due oggetti.
Ho creato prima Casella, destinato ad apparire sulla seconda e su eventuali altre colonne con sfondo bianco, successivamente Calendario, destinato ad apparire sulla prima colonna con le date scritte sopra.
Nella prima ho una proprietà testo e un metodo Scrivi che non fa assolutamente nulla (in modo che quando il codice li chiami non generi un errore in quanto inesistenti); il metodo Scrivi viene overridato nella classe derivata Calendario con un metodo Scrivi che invece scrive il valore della proprietà testo.
Class Casella
    Inherits Label
    Public testo As String
    Overridable Sub Scrivi()
    End Sub
End Class

Class Calendario
    Inherits Casella
    Overrides Sub Scrivi()
        Text = testo
    End Sub
End Class
la proprietà testo non viene specificata nella classe derivata Calendario in quanto già presente nella classe genitrice e quindi ereditata.

Ed ecco il codice che chiama per due volte la funzione disponiCaselle, l'una per la classe Calendario, prima colonna, e l'altra per la classe Casella, seconda colonna.
        disponiCaselle(Of Calendario)(larghezze(0), SommaElementiDiArray(larghezze, 0))
        disponiCaselle(Of Casella)(larghezze(1), SommaElementiDiArray(larghezze, 1))
Il risultato è perfetto:

Nessun commento:

Posta un commento