Ответ 1
Если "объект C ориентирован?" вы имеете в виду, что "есть C, разработанный специально для поддержки объектно-ориентированного программирования"? то нет, C явно не объектно ориентирован.
Я разговаривал с коллегой о C и С++, и он утверждал, что C объектно-ориентированный, но я утверждал, что это не так. Я знаю, что вы можете делать объектно-ориентированные вещи в C, но С++ - это истинный объектно-ориентированный язык.
Каковы ваши мысли?
Кроме того, это вызвало дискуссию о том, кто решает, что значит быть объектно-ориентированным, и что трудно сказать, что объектно-ориентированное действительно официально означает. Что вы думаете об этом?
Если "объект C ориентирован?" вы имеете в виду, что "есть C, разработанный специально для поддержки объектно-ориентированного программирования"? то нет, C явно не объектно ориентирован.
Вы можете программировать в объектно-ориентированном стиле на более или менее любом языке. (Я думаю, что полиморфизм во время выполнения - то есть виртуальные методы - требует языка, который поддерживает указатели на функции.)
Вот несколько примеров:
C не объектно-ориентированный. В этом и заключалась вся цель ++
Что касается определения того, что требуется, чтобы быть объектно-ориентированным: проверьте википедию.
Лично, если он поддерживает наследование, инкапсуляцию и полиморфизм, тогда все в порядке. Еще один ключ здесь - иметь хорошие ключевые слова, такие как класс и объект, как правило, которые помогают...
Примеры реальных объектно-ориентированных языков (не окончательных): Smalltalk, Java, С#, Python, Ruby, C++..
Кроме того, возможно иметь расширения для обеспечения функций OO, таких как PHP, Perl, VB (не .Net),...
Реальные программисты могут писать объектно-ориентированный код на ЛЮБОЙ язык.
Но нет, C не является "объектно-ориентированным" языком. Он не имеет понятия классов, объектов, полиморфизма, наследования.
Путаница может заключаться в том, что C может использоваться для реализации объектно-ориентированных понятий, таких как полиморфизм, инкапсуляция и т.д., что может побудить вашего друга полагать, что C объектно-ориентированный. Проблема состоит в том, что для того, чтобы считаться объектно-ориентированным языком программирования, эти функции должны быть встроены в язык. Какими они не являются.
Но если вы знаете трюк, вы можете легко добавить к нему объектно-ориентированную возможность, просто используя struct, function pointer и self-pointer. DirectFB - такая C-библиотека, написанная объектно-ориентированным способом. Плохо, что это больше подвержено ошибкам, поскольку оно не регулируется синтаксисом и проверкой типа компиляции. Вместо этого он основан на соглашении о кодировании.
например.
IDirectFB/*a typedef of a struct*/ *dfb = NULL;
IDirectFBSurface/*another typedef of a struct*/ *primary = NULL;
DirectFBCreate (&dfb); /*factory method to create a struct (e.g. dfb) with
pointers to function and data. This struct is
like an object/instance of a class in a language with build-in
syntax support for object oriented capability */
dfb->SetCooperativeLevel/*function pointer*/
(dfb/*self pointer to the object dfb*/,
DFSCL_FULLSCREEN);
dsc.flags = DSDESC_CAPS;
dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
dfb->CreateSurface/*function pointer, also a factory method
to create another object/instance */
( dfb/*self pointer to the object dfb*/,
&dsc,
&primary/*another struct work as object of another class created*/ );
primary->GetSize/*function pointer*/
(primary/*self pointer to the object primary*/,
&screen_width,
&screen_height);
2. С++ является объектно-ориентированным, поскольку он имеет встроенную поддержку объектно-ориентированных возможностей, таких как класс и наследование. Но есть аргумент, что это не полный или чистый объектно-ориентированный язык, поскольку он допускает синтаксис Си (синтаксис структурного программирования). Я также помню, что С++ не хватает нескольких объектно-ориентированных возможностей, но не помню каждый точно.
C не является языком O-O при любом определении "O-O" и "language".
В качестве языка реализации для компонента, который предоставляет API O-O своим клиентам, довольно просто использовать C. Система X Windows - это, по сути, система O-O с одним наследованием при просмотре ее API, но полный беспорядок C при просмотре ее реализации.
Ответ может быть да или нет, в зависимости от:
Если вы спросите: "C является объектно-ориентированным языком?", ответ "нет", потому что у него нет объектно-ориентированных конструкторов, ключевых слов, семантики и т.д.
если вы намерены "я могу реализовать ООП в C?", ответ "да", потому что ООП - это не только требование языка, но и способ "мышления", подход к программированию, прежде касаться какого-либо языка или другого. Однако реализация ООП на С (или любой другой язык, не предназначенный для ООП), безусловно, будет "принудительно" и очень сложна в управлении, чем любой другой язык ООП, поэтому также ожидается некоторое ограничение.
Если ваш друг не говорил о Objective C (OS superset of C), тогда нет, C не является языком OO. Вы можете реализовать концепции OO с помощью C (что сделал старый компилятор С++ С++, он перевел С++ на C), но это не делает C OO-язык, поскольку он специально не предлагает поддержку стандартных методов OO, таких как полиморфизм или инкапсуляция.
Да, вы можете написать программный стиль OO на C, особенно с использованием либерального (ab-) использования макросов, но как кто-то, кто видел результаты некоторых из этих попыток, я настоятельно рекомендую использовать более подходящий язык.
Реальные программисты могут писать объектно-ориентированный код на ЛЮБОЙ язык.
Я видел объектно-ориентированный кобол. Кобол, который называет Кобола. Вы хотите назвать этих программистов "Реал"?
C не является объектно-ориентированным языком. C - универсальный, императивный язык, поддерживающий структурированное программирование. Поскольку C не является объектно-ориентированным, поэтому С++ появился, чтобы иметь функцию ООП, а ООП - модель языка программирования, организованная вокруг объектов. Язык для того, чтобы иметь функцию ООП, должен реализовывать определенные принципы ООП. Многие из них - Наследование, Полиморфизм, Абстракция, Инкапсуляция.
C не является объектно-ориентированным.
C не ориентирует на объекты.
C++ делает.
Нет, это не так, твой друг ошибается.