Przeciążanie metody OM GET()

From MorphOS Library

Grzegorz Kraszewski


Ten artykuł w innych językach: angielski


Metoda OM_GET() służy do odczytywania wartości atrybutu obiektu. Otrzymuje strukturę opGet jako strukturę parametrów. Struktura opGet jest zdefiniowana w pliku nagłówkowym <intuition/classusr.h>:

struct opGet
{
  ULONG  MethodID;           /* zawsze OM_GET (0x104) */
  ULONG  opg_AttrID;
  ULONG *opg_Storage;
};

W przeciwieństwie do OM_SET(), ta metoda w jednym wywołaniu odczytuje zawsze jeden atrybut. Jego identyfikator umieszcza się w polu opg_AttrID. Pole opg_Storage jest wskaźnikiem na miejsce w pamięci, gdzie zostanie umieszczona odczytana wartość atrybutu. Pole to jest zdefiniowane jako wskaźnik na ULONG, ale może wskazywać na cokolwiek (na przykład jakąś większą strukturę). Dzięki temu można odczytywać wartości nie mieszczące się w 32 bitach. Ponieważ metoda OM_GET() nie ma pętli przeglądania taglisty, jej implementacja jest prosta:

IPTR MyClassGet(Class *cl, Object *obj, struct opGet *msg)
{
  switch (msg->opg_AttrID)
  {
    case Tag_Liczbowy:
      *msg->opg_Storage = /* wartość atrybutu */;
    return TRUE;

    case Tag_Tekstowy:
      *(char**)msg->opg_Storage = "stały tekst";
    return TRUE;
  }

  return DoSuperMethodA(cl, obj, (Msg)msg);
}

Funkcja metody OM_GET() składa się z wyrażenia switch z przypadkami dla wszystkich rozpoznawanych atrybutów. Jeżeli atrybut jest rozpoznany, wynikiem funkcji powinna być wartość logiczna TRUE. To bardzo ważne, ponieważ notyfikacje nie będą działały na danym atrybucie jeżeli OM_GET() zwróci po prostu zero. Nierozpoznane atrybuty są przekazywane do klasy nadrzędnej. Wywołanie funkcji DoSuperMethodA() może być alternatywnie umieszczone w przypadku default wyrażenia switch. Trzeba zwrócić uwagę na fakt, że przy zapisywaniu wartości atrybutu odwołujemy się do wartości wskazywanej przez msg->opg_Storage. Jeżeli typem wartości nie jest liczba całkowita, niezbędne jest rzutowanie typu. Dla wartości typu T, odwołanie się do niej wraz z rzutowaniem jest zapisywane w C jako *(T*).