Αντικατάσταση προεπιλεγμένων χειριστών σημάτων

Μέχρι τώρα σας έχουμε πει να εκτελείτε ενέργειες σε απάντηση των πατημάτων πλήκτρου και το παρόμοιο χειριζόμενοι σήματα. Αυτός είναι σίγουρα ένας καλός τρόπος να γίνονται τα πράγματα, αλλά δεν είναι ο μόνος τρόπος.

Αντί για την επίπονη σύνδεση χειριστών σημάτων σε σήματα, μπορείτε να κάνετε απλά μια νέα κλάση που κληρονομεί από ένα γραφικό συστατικό - ας πούμε, ένα πλήκτρο - και έπειτα να αντικαταστήσετε τον προεπιλεγμένο χειριστή σήματος, όπως τον Button::on_clicked(). Αυτό μπορεί να είναι πιο απλό από την αγκίστρωση χειριστών σήματος για καθετί.

Η δημιουργία υποκλάσεων δεν είναι πάντα ο καλύτερος τρόπος πραγματοποίησης. Είναι χρήσιμος μόνο όταν θέλετε το γραφικό συστατικό να χειρίζεται το δικό του σήμα από μόνο του. Αν θέλετε κάποια άλλη κλάση να χειρίζεται το σήμα, τότε θα χρειαστείτε να συνδέσετε έναν ξεχωριστό χειριστή. Αυτό είναι ακόμα περισσότερο αληθές, αν θέλετε αρκετά αντικείμενα να χειρίζονται το ίδιο σήμα, ή αν θέλετε ένας χειριστής σήματος να απαντά στο ίδιο σήμα από διαφορετικά αντικείμενα.

Οι κλάσεις gtkmm σχεδιάζονται με την αντικατάσταση κατά νου· περιέχουν εικονικές μεθόδους μέλους με ειδικό σκοπό να αντικατασταθούν.

Ας κοιτάξουμε ένα παράδειγμα αντικατάστασης:

#include <gtkmm/button.h>

class OverriddenButton : public Gtk::Button
{
protected:
    virtual void on_clicked();
}

void OverriddenButton::on_clicked()
{
    std::cout << "Hello World" << std::endl;

    // κλήση της έκδοσης της μεθόδου της κλάσης βάσης:
    Gtk::Button::on_clicked();
}

Εδώ ορίζουμε μια νέα κλάση που λέγεται OverriddenButton, που κληρονομεί από την Gtk::Button. Το μόνο που αλλάζουμε είναι η μέθοδος on_clicked(), που καλείται όποτε η Gtk::Button εκπέμπει το σήμα clicked. Αυτή η μέθοδος εκτυπώνει "Hello World" στην stdout και έπειτα καλεί την αρχική υποκατεστημένη μέθοδο, για να επιτρέψει στην Gtk::Button να κάνει ό,τι θα είχε κάνει αν δεν είχε αντικατασταθεί.

Δεν χρειάζεται πάντα να καλέσετε τη γονική μέθοδο· υπάρχουν φορές που μπορεί να μην το θέλετε. Σημειώστε ότι, καλούμε τη γονική μέθοδο αφού γράψουμε "Hello World", αλλά μπορούμε να την έχουμε καλέσει πριν. Σε αυτό το απλό παράδειγμα, δεν πειράζει πολύ, αλλά υπάρχουν φορές που πειράζει. Με σήματα, δεν είναι τόσο εύκολη η αλλαγή λεπτομερειών όπως αυτή και μπορείτε να κάνετε κάτι εδώ που δεν μπορείτε να κάνετε καθόλου με συνδεμένους χειριστές σήματος: μπορείτε να καλέσετε τη γονική μέθοδο στο μέσο του προσαρμοσμένου κώδικά σας.