Я думаю, что C отлично подходит и подходит для реализации объектно-ориентированных концепций, пожав плечами . Большинство различий между общепринятым подмножеством языков, рассматриваемых как объектно-ориентированные, на мой взгляд, незначительны и синтаксичны с моей прагматической точки зрения.
Начнем, скажем, с сокрытия информации. В C мы можем достичь этого, просто скрывая определение структуры и работая с ней через непрозрачные указатели. Это фактически моделирует public
против private
различия полей данных , так как мы получаем с классами. И это достаточно просто сделать и вряд ли анти-идиоматично, так как стандартная библиотека C сильно зависит от этого, чтобы добиться сокрытия информации.
Конечно, вы теряете возможность легко контролировать, где именно структура размещается в памяти, используя непрозрачные типы, но это только заметное различие между, скажем, C и C ++. C ++, безусловно, является превосходным инструментом при сравнении его способности программировать объектно-ориентированные концепции на C, сохраняя при этом контроль над макетами памяти, но это не обязательно означает, что Java или C # превосходят C в этом отношении, поскольку эти два делают вас полностью теряет способность контролировать, где объекты размещены в памяти.
И мы должны использовать такой синтаксис, как fopen(file, ...); fclose(file);
в отличие от file.open(...); file.close();
большого возгласа. Кто на самом деле заботится? Может быть, просто тот, кто сильно полагается на автозаполнение в своей IDE. Я признаю, что это может быть очень полезной функцией с практической точки зрения, но, возможно, не такой, которая требует обсуждения того, подходит ли язык для ООП.
Нам не хватает возможности эффективно внедрять protected
поля. Я полностью подчинюсь там. Но я не думаю, что есть конкретное правило, которое гласит: « Все ОО-языки должны иметь функцию, позволяющую подклассам получать доступ к членам базового класса, которые по-прежнему недоступны для обычных клиентов ». Кроме того, я редко вижу варианты использования для защищенных пользователей, которые, по крайней мере, немного не подозревают о том, что могут стать препятствием на пути обслуживания.
И, конечно, мы должны «эмулировать» ОО-полиморфизм с помощью таблиц функциональных указателей и указателей на них для динамической отправки с небольшим дополнительным шаблоном для инициализации этих аналогичных vtables
и vptrs
, но немного шаблонного шаблона, который никогда не вызывал у меня большого горя.
Наследование во многом аналогично. Мы можем легко смоделировать это с помощью композиции, и во внутренней работе компиляторов все сводится к одному и тому же. Конечно, мы теряем безопасность типов, если мы хотим понизить рейтинг , и я бы сказал, что если вы вообще хотите понизить рейтинг , пожалуйста, не используйте для этого C, потому что то, что люди делают в C для эмуляции понижения, может быть ужасным для типа. с точки зрения безопасности, но я бы предпочел, чтобы люди вообще не унывали . Безопасность типов - это то, что вы легко можете пропустить в C, так как компилятор предоставляет столько возможностей для интерпретации вещей, как просто биты и байты, жертвуя возможностью отлавливать возможные ошибки во время компиляции, но некоторые языки считаются объектно-ориентированными. даже статически не напечатано.
Так что не знаю, я думаю, что все в порядке. Конечно, я бы не использовал C, чтобы попытаться создать крупномасштабную кодовую базу, которая соответствует принципам SOLID, но это не обязательно из-за ее недостатков в объектно-ориентированном фронте. Многие функции, которые мне не хватало бы, если бы я попытался использовать C для таких целей, были бы связаны с языковыми функциями, которые не считаются непосредственно необходимыми для ООП, такими как строгая безопасность типов, деструкторы, которые автоматически вызываются, когда объекты выходят из области видимости, оператор перегрузка, шаблоны / шаблоны и обработка исключений. Это когда я скучаю по тем вспомогательным функциям, которые мне доступны для C ++.