@teh_KaiN, post #2
/* Metody poszczególnych typów obiektów */ LONG Magazynier(struct Plansza *plansza, struct Obiekt *obiekt, LONG metoda, APTR dane); LONG Skrzynia(struct Plansza *plansza, struct Obiekt *obiekt, LONG metoda, APTR dane);
@Hexmage960, post #3
#define PROTOKOL_21 struct Plansza *plansza, struct Obiekt *obiekt, LONG metoda, APTR dane LONG Magazynier(PROTOKOL_21);
#define PROTOKOL_21(f) LONG f(struct Plansza *plansza, struct Obiekt *obiekt, LONG metoda, APTR dane) PROTOKOL_21(Magazynier);
@Krashan, post #4
@Hexmage960, post #5
Generalnie wzorowałem się też na Amigowym BOOPSINie do końca, BOOPSI ma jedną funkcję DoMethod(), którą obsługujesz wszystkie klasy obiektów, klasa obiektu jest zapisana w obiekcie. Dzięki temu problem z wielokrotnym deklarowaniem funkcji z tym samym „protokołem” nie istnieje. I można mieć dziedziczenie klas. U Ciebie to raczej niewykonalne.
@Krashan, post #7
typedef LONG (*Metoda)(struct Plansza *plansza, struct Obiekt *obiekt, LONG metoda, APTR dane);
@Krashan, post #4
/* Definicja struktury */ typedef struct MetodaParam { struct Plansza *plansza; struct Obiekt *obiekt; LONG metoda; APTR dane; } *PARAM; /* Deklaracje */ LONG Magazynier(PARAM); LONG Skrzynia(PARAM); LONG Krysztal(PARAM); LONG Stworek(PARAM); /* Funkcja pośrednicząca */ LONG WywolajMetode(struct Plansza *plansza, struct Obiekt *obiekt, LONG metoda, APTR dane) { struct MetodaParam param; param.plansza = plansza; param.obiekt = obiekt; param.metoda = metoda; param.dane = dane; return(Metody[obiekt->Typ](¶m)); }
@Hexmage960, post #3
@asman, post #10
@Hexmage960, post #11
Generalnie chodzi o przejrzystość
- Metoda - numer metody,
- Dane - pomocnicze dane, zależne od metody.
@teh_KaiN, post #12
LONG Skrzynia(struct Plansza *plansza, struct Obiekt *obiekt, Wiadomosc wiad);
typedef struct { LONG metoda; } *Wiadomosc;