Ereditarietà!!!
Class Casella Inherits Label End ClassBene.
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 SubE 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 ClassEd 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 TOra 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 Classla 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