Ja sicher. Aber der Compiler/Interpreter übernimmt uns die Auswahl der richtigen Funktion implizit. Sie muß ja trotz allem getroffen werden.BlackJack hat geschrieben:@DeJe: Der wichtigste Unterschied zwischen ``foo(bar)`` und ``bar.foo()`` ist die Polymorphie beim zweiten Fall. Je nach dem an was `bar` gebunden ist, wird ein anderes `foo()` *automatisch* ausgeführt, wo man beim ersten Fall explizite Fallunterscheidungen in der Funktion `foo()` machen muss, was hässlich und unflexibel ist.

Es ist vielleicht hässlich anzusehen, aber unflexibel ist eine explizite Fallunterscheidung in der Funktion nicht. Man kann sich sogar "objektorientierter" Methoden bedienen und die Datenstruktur selbst mit Funktionsreferenzen füllen, die wiederum aufgerufen werden. Das funktioniert sogar in C und voilà, wir haben OOC.

Code: Alles auswählen
typedef void (func) (void *d);
typedef struct {
int i;
func *f;
} Daten;
void do_something_a(Daten *d)
{
d->i++;
}
void do_something_b(Daten *d)
{
d->i += 10;
}
int do_something(Daten *d)
{
d->f(d);
return d->i;
}
int main(int argc, char **argv)
{
Daten a = { 0, (func*)do_something_a };
Daten b = { 10, (func*)do_something_b };
printf( "%d, %d\n", do_something(&a), do_something(&b) );
a.f(&a);
b.f(&b);
printf( "%d, %d\n", a.i, b.i );
return 0;
}