Fråga
Hej,
Vad menar man med att callbacks (funktionspekare) i C är en form av generisk programmering. Om jag fattat det rätt så är det C’s sätt att vara objektorienterat, eller?
Svar
Först och främst bör man hålla isär koncepten generisk programmering och objektorientering (OO). Generisk programmering är till för att man skall kunna designa och programmera något en gång, för att sedan låta kompilatorn generera implementationer för alla datatyper som kan tänkas behövas. Objektorientering är en samling av begrepp som innehåller bland annat typkontroll, arv, polymorfism och inkapsling av medlemmar och metoder. Ett språk kan ha mekanismer och syntaktiskt stöd för båda dessa koncept, men C har egentligen ingetdera. C++ är som du vet en utökning av C och där finns både generisk programmering (templates) och objektiorentering (klasser, arv, typkontroll m.m.). Även Objective-C är värt att nämna i detta sammanhang, fast det utökar endast C med objektorientering och inte med generisk programmering.
Dock så stämmer det som du säger att funktionspekare ofta används för att efterlikna ett objektorienterat beteende. Strukturer och funktionspekare kan kombineras för att efterlikna klasser. Makron är vanligt när man vill simulera generisk programmering, men de är också ökända för att introducera svårfunna programfel.
Man kan också förtydliga att callbacks i strikt mening inte är samma sak som en funktionspekare. En callback är en programmeringsmetod för att få ett meddelande när något inträffar i programmet, exempelvis när användaren trycker på en knapp. En funktionspekare är som vilken pekare som helst, med skillnaden att den pekar på en funktion. Ofta vill man kunna ange en speciell funktion (adress) att hoppa till när en callback inträffar, och då är funktionspekare mycket användbart.
Om du är intresserad av att veta mer om hur objektorientering och generisk programmering kan simuleras, rekommenderar jag att du tittar på GLib och GObject (del av GTK+ biblioteket, www.gtk.org ).