JavascriptProva

giovedì 30 agosto 2012

Soluzione per il fatto che la procedura template accetta solo il costruttore di default

Bene... per i miei scopi, non devo fare in modo che il testo della mia casella venga definito nel costruttore, perchè la creazione della nuova istanza, e quindi la chiamata del costruttore, è immediata, e definendo nell'ambito del costruttore che il testo debba essere uguale alla proprietà Dati, questa proprietà è ancora pari a una stringa vuota, in quanto la procedura template la "riempie" dopo che l'istanza è stata creata, e quindi solo dopo che il costruttore è entrato in azione.

Lascio quindi il costruttore di default sottinteso (ossia non specifico costruttori nella classe), e creo un metodo che viene chiamato dopo.
Ci provo...Creo due classi, la prima "casella" che eredita da Label, la seconda "calendario", in cui voglio che il testo rispecchi il valore della proprietà Dati, che eredita da "casella".
Class casella
    Inherits Label
    Protected Dati As Date
    Sub New()
        BorderStyle = BorderStyle.FixedSingle
    End Sub
    Overridable Sub scriviDati(ByVal dato As String)
        Dati = dato
    End Sub
End Class

Class calendario
    Inherits casella
    Overrides Sub scrividati(ByVal dato As String)
        Dati = dato
        Text = Dati
    End Sub
End Class
Il metodo scriviDati è overridable, in modo che nella classe genitrice compila solo il valore della proprietà, mentre nella classe derivata compila anche il testo con il valore della proprietà.

Ecco la procedura template:
    Sub popola(Of oggetto As New)(ByVal frm As Form, ByVal dt As Object)
        Dim obj As Object
        For n = 0 To dt.Length - 1
            obj = New oggetto
            With obj
                .left = 0
                .top = obj.height * (n Mod dt.Length)
                .scriviDati(dt(n))

            End With
            frm.Controls.Add(obj)
        Next
    End Sub
...che esegue sempre la funzione scriviDati, la quale, se il tipo di oggetto fornito alla procedura template è "casella" compila soltanto il valore della proprietà Dati, mentre se il tipo di oggetto fornito alla procedura template è "calendario", fa apparire anche questo valore come testo.

Funziona!

Mi sbizzarrisco un po', traendo le conclusioni logiche più tardi...
Class casella
    Inherits Label
    Protected Dati As Date
    Sub New()
        BorderStyle = BorderStyle.FixedSingle
    End Sub
    Overridable Sub scriviDati(ByVal dato As String)
        Dati = dato
    End Sub
End Class

Class calendario
    Inherits casella
    Sub New()
        BorderStyle = BorderStyle.Fixed3D
        BackColor = Color.Green
    End Sub
    Overrides Sub scrividati(ByVal dato As String)
        Dati = dato
        Text = Dati
    End Sub
End Class
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        popola(Of calendario)(0, Me, giorniDelMese(8, 2012))
        popola(Of casella)(100, Me, giorniDelMese(8, 2012))
    End Sub
    Sub popola(Of oggetto As New)(ByVal sinistra As Integer, ByVal frm As Form, ByVal dt As Object)
        Dim obj As Object
        For n = 0 To dt.Length - 1

            obj = New oggetto
            With obj
                .left = sinistra
                .top = obj.height * (n Mod dt.Length)
                .scriviDati(dt(n))

            End With
            frm.Controls.Add(obj)
        Next
    End Sub
Ed ecco cosa ottengo:

Nessun commento:

Posta un commento