Implementazione di routine generiche [chiuso]

0

È possibile implementare routine generiche in qualsiasi lingua (C #, Java, ecc.). Per routine generiche intendo, in specifici gestori di eventi. Diciamo, ho 2 pulsanti e 2 caselle di testo. Un pulsante, se premuto, prende il primo testo della casella di testo e lo converte in maiuscolo e il secondo pulsante stampa la lunghezza della stringa nell'altra casella di testo. Ora, posso avere una funzione come

button(type, textbox) {
if(type==1)
/*Convert to upper case*/
else if(type==2)
/*Print the length*/
}

Il tipo accetta qualsiasi pulsante come input e lo elabora ulteriormente. Voglio implementarlo a causa della ridondanza nel mio codice e voglio rendere il mio codice portatile ad altre lingue. In modo che ho bisogno di modificare solo la sintassi per farlo funzionare. È fattibile?

    
posta subham soni 02.05.2014 - 03:59
fonte

2 risposte

1

Normalmente, questo dovrebbe essere fatto avendo un gestore per ogni logica.

void handleUppercase(object sender, EventArgs args)
{
    // convert text to uppercase
}

void handleLength(object sender, EventArgs args)
{
    // display length
}

// then assign those handlers properly
button1.OnClick += handleUppercase
button2.OnClick += handleLength

Inoltre, non avrai molta fortuna nel cambiare il codice per lingue diverse, perché le diverse lingue usano diversi framework UI. E ci sono troppe differenze tra questi quadri per consentire qualsiasi tipo di condivisione. Se vuoi avere lo stesso codice in diverse lingue, devi assicurarti che non dipenda da alcun framework specifico. Quali sono i framework dell'interfaccia utente.

Il caso è molto diverso quando si ha la stessa logica, ma su pulsanti diversi con parametri diversi. In questo caso, hai 2 opzioni di base.

Il primo è usare un approccio simile a quello che Robert suggerisce:

void handleUppercase(object sender, EventArgs args)
{
    if (sender == buttonA) // do logic for first arguments
    if (sender == buttonB) // do logic for second arguments
}
buttonA.OnClick += handleUppercase
buttonB.OnClick += handleUppercase

La seconda opzione è quella di parametrizzare il gestore stesso. In OOP, ciò potrebbe essere eseguito se il gestore era un comando . È sufficiente creare diverse istanze di comando con parametri diversi per ciascun pulsante. In modo funzionale, è possibile utilizzare applicazione parziale . Ma poiché C # non ha questo concetto, devi aiutare te stesso con lambda:

void handleUppercase(object sender, EventArgs evArgs, Argument arg)
{
    // do logic for arg
}

buttonA.OnClick += (s, e) => { handleUppercase(s, e, arg1); }
buttonB.OnClick += (s, e) => { handleUppercase(s, e, arg2); }
    
risposta data 02.05.2014 - 09:20
fonte
0

In C #, sarebbe simile a questa:

// Loop through the controls on the form, and do something
// specific with each control, based on its type.
foreach (Control control in form.Controls)
{
    switch (control.GetType().Name)
    {
        case "TextBox":
            var textBox = (TextBox)control;
            // Do something with the text box
            break;
        case "ComboBox":
            var comboBox = (ComboBox)control;
            // Do something with the combo box
            break;
        case "CheckBox":
            var checkBox = (CheckBox)control;
            // Do something with the checkbox
            break;
    }
}

Questo codice funziona perché tutti i controlli di Winforms ereditano da una classe di controllo di base.

    
risposta data 02.05.2014 - 07:51
fonte

Leggi altre domande sui tag