/*
пример ООП для C
*/
// описание интерфейса с именем "interface"
struct interface
{
  struct interface_tab * iface;
};

// описания класса "class1" реализующего интерфейс "interface"
struct class1
{
  struct interface_tab * iface;
  int field1;
  int field2;
};

union interface_obj {
   struct interface iface;
   // добавляем сюда все классы реализующие этот интерфейс
   struct class1 class1;
};

struct interface_tab
{
   int (*metod1)(union interface_obj * ,int,int);
   int (*metod2)(union interface_obj * ,int);
};

int class1_metod1(union interface_obj * self ,int a,int b)
{
   self->class1.field1=a;
   self->class1.field2=b;
   return(1);
}
int class1_metod2(union interface_obj * self ,int a)
{
   return(self->class1.field1*a + self->class1.field2);
}

static struct interface_tab class1_iface =
{
  class1_metod1,
  class1_metod2,
};

// создание екземпляра класса "class1" с именем "obj"
struct class1 class1_obj={&class1_iface,0,0};

// так ето работает:
int main ()
{
    union interface_obj * obj = (union interface_obj *)&class1_obj;

    obj->iface.iface=&class1_iface; 

    obj->iface.iface->metod1(obj,3,6);

    printf("result:%i\nwrite for 2ch.ru by Katalog-kun, 2008.12.11\nphone +7-903-513-64-21\n",
    obj->iface.iface->metod2(obj,10)
    );

    return 0;
}
