glib я так понимаю - это реализация, хотелось бы услышать именно теорию. Какие принципы нужно соблюдать чтобы реализовать это. Если я ему отвечу "С помощью специальных библиотек, например таких как glib, можно реализовать ООП-модель например в языках Си...", ну и так далее, думаю ему такой ответ не понравится.
> ООП - это инкапсуляция, наследование и полиморфизм.
Гыгы три раза.
OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I’m not aware of them.
> Из прочитанного могу сказать, что очень сомнительно что реализация последних двух возможна в таких языках как Си без дополнительных библиотек.
Полиморфизм - элементарно. На таблицу указателей на функции тебе уже намекали. А наследование - совсем необязательная фишка, агрегация и прототипирование не хуже, как минимум.
>OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I’m not aware of them.
>Отцу виднее.
я придумал термин "объектно-ориентированный" и я не имел в виду си плюс плюс(с) ?
это только одно из определений, и зачастую преподаватели в вузах с ним не согласны)
Ну про что я собственно и говорил - неродные средства языка. А я так понял препод хочет именно средствами языка. Там скорее не Объектно-ориентированный подход, а просто объектный в некотрой литературе я встречал такое понятие, про объектные модели которые не реализуют все три принципа ООП.
>Ну про что я собственно и говорил - неродные средства языка. А я так понял препод хочет именно средствами языка.
Ты так говоришь, как буд-то glib совсем сторонная либа, которая из си делает что-то ужасное (гм.. по описанию получился с++). Она же на Си написана. Если нельзя использовать сторонние библиотеки, то просто возьми исходники и разберись как все устроено в glib.. и по аналогии сделай то что нужно.
ВО-первых, ООП - это инкапсуляция, полиморфизм и наследование, чтобы там не говорили "Отцы". Можно придумывать определений сколько угодно, но классическое - я привел.
Теперь о реализации.
Инкапсуляция, как сказано выше - добавлять в структуру указатели на функции, принимающие первым аргументом указатель на структуру.
Наследование - в С реализуется путем аггрегирования. Из-за особенности реализации вполне можно приводить указатель на потом к указателю на "базовый" класс и обратно:
Например
typedef struct {
int a;
} A;
typedef struct {
A a;
int b;
} B;
....
B* b = (B*)malloc(sizeof(B));
A* a = (A*) b;
a.a = 10;
printf("%d", b.a.a);
Конечно, не поддерживается множественное наследование, но оно вообще мало где поддерживается.
Теперь полиморфизм. Реализуется через VTBL, точно так же, как сделано в большинстве компиляторов С++.
Кстати, ВСЕ фичи С++ можно реализовать на С.
>ВО-первых, ООП - это инкапсуляция, полиморфизм и наследование, чтобы там не говорили "Отцы".
Ха-ха-ха-ха-ха. ООП - это привязка определенных ДЕЙСТВИЙ к определенному ТИПУ.
А уж какие извращения ты там творишь с интерфейсом и поведением, кто ответственен за выбор нужного "действия" и когда происходит привязка - дело десятое.
Шаблоны на С делаются очевидным образом - размножением соответствующих типов.
В случае шаблонов компилятор приходит тебе на помощь, делая это за тебя.
Множественное наследование реализовать на С можно. Просто это будет существенно более трудоемкая задача.