Я говорил с коллегой о C и C++, и он утверждал, что C объектно-ориентирован, но я утверждал, что это не было. Я знаю, что можно сделать как будто объектно-ориентированные вещи в C, но C++ является истинным объектно-ориентированным языком.
Каковы Ваши мысли?
Кроме того, это включило обсуждение, кто решает то, что это означает быть объектно-ориентированным и что трудно сказать, что объектно-ориентированный действительно официально означает. Кто Вы мысли об этом?
Если под "является ли C объектно-ориентированным?" вы подразумеваете "разработан ли C со средствами специально для поддержки объектно-ориентированного программирования?", то нет, C явно не является объектно-ориентированным.
Настоящие программисты могут писать объектно-ориентированный код на ЛЮБОМ языке.
Я видел объектно-ориентированного кобола. Кобол, который зовет Кобол. Вы хотите называть этих программистов «Настоящими»?
Настоящие программисты могут писать объектно-ориентированный код на ЛЮБОМ языке.
Но нет, C не является «объектно-ориентированным» языком. В нем нет понятия классов, объектов, полиморфизма, наследования.
Но если вы знаете этот трюк, вы можете легко добавить к нему объектно-ориентированные возможности, просто используя структуру, указатель на функцию и указатель на себя. 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 ++ является объектно-ориентированным, поскольку он имеет встроенную поддержку объектно-ориентированных возможностей, таких как классы и наследование. Но есть аргумент, что это не полный или чистый объектно-ориентированный язык, поскольку он допускает в нем синтаксис C (синтаксис структурного программирования). Я также помню, что C ++ не хватает некоторых объектно-ориентированных возможностей, но не помню точно каждую из них.
C не является объектно-ориентированным. В этом и заключалась вся цель ++
. Что касается определения того, что нужно для объектно-ориентированной архитектуры: проверьте wikipedia .
Лично, если он поддерживает наследование, инкапсуляцию и полиморфизм, тогда вам хорошо. Еще один ключ здесь - наличие хороших ключевых слов, таких как class и object, как правило, помогают ...
Примеры реальных объектно-ориентированных языков (не окончательные): Smalltalk, Java, C #, Python, Ruby, C ++ ..
Кроме того, возможно наличие расширений для предоставления функций объектно-ориентированного программирования, таких как PHP, Perl, VB (не .Net), ...
Путаница может заключаться в том, что C может использоваться для реализации объектно-ориентированных концепций, таких как полиморфизм, инкапсуляция и т.д., что может привести вашего друга к мысли, что C является объектно-ориентированным. Проблема в том, что для того, чтобы считаться объектно-ориентированным языком программирования, эти возможности должны быть встроены в язык. А это не так.
Вы можете программировать в объектно-ориентированном стиле на более или менее любом языке. (Я думаю, что полиморфизм во время выполнения - т.е. виртуальные методы - требует языка, поддерживающего указатели функций.)
Вот пара примеров:
Если только ваш друг не говорил об Objective C (OO супермножество C), то нет, C не является OO языком. Вы можете реализовать концепции ОО, используя C (именно это делал старый компилятор cfront C++, он переводил C++ в C), но это не делает C языком ОО, поскольку он не предлагает поддержки стандартных техник ОО, таких как полиморфизм или инкапсуляция.
Да, вы можете писать программы в стиле ОО на языке Си, особенно с либеральным (аб-) использованием макросов, но как человек, который видел результаты некоторых из этих попыток, я бы настоятельно рекомендовал использовать более подходящий язык.