Я думаю, що C ідеально чудовий і пристойний для реалізації об'єктно-орієнтованих концепцій, знизайте плечима . Я вважаю, що більшість відмінностей між загальним набором знаменника мов, що вважаються об'єктно-орієнтованими, є мінорними та синтаксичними за своєю суттю з мого прагматичного погляду.
Почнемо з, скажімо, приховування інформації. У C ми можемо досягти цього, просто приховавши визначення структури та працюючи з нею через непрозорі покажчики. Це ефективно моделює public
порівняно з private
відмінністю полів даних, як ми отримуємо з класами. І це досить легко зробити і навряд чи є антиідіоматичним, оскільки стандартна бібліотека С дуже покладається на це, щоб досягти приховування інформації.
Звичайно, ви втрачаєте здатність легко керувати саме тим місцем, де структура виділена в пам'яті, використовуючи непрозорі типи, але це лише примітна різниця між, скажімо, C і C ++. C ++, безумовно, є чудовим інструментом при порівнянні його здатності програмувати об'єктно-орієнтовані концепції на C, зберігаючи при цьому контроль над макетами пам'яті, але це не обов'язково означає, що Java або C # переважають над C у цьому плані, оскільки ці два змушують вас повністю втрачають здатність контролювати, де об’єкти виділяються в пам'яті.
І ми мусимо використовувати синтаксис, як fopen(file, ...); fclose(file);
на відміну від, file.open(...); file.close();
але великий whoop. Кого насправді хвилює? Можливо, просто хтось, хто сильно схиляється до автозаповнення в IDE. Я визнаю, що це може бути дуже корисною з практичної точки зору, але, можливо, не такою, яка потребує обговорення того, чи підходить мова для ООП.
Нам не вистачає здатності ефективно реалізовувати protected
поля. Я повністю підпорядкуюсь там. Але я не думаю, що існує конкретне правило, яке говорить: " Усі мови OO повинні мати функцію, яка дозволяє підкласам отримувати доступ до членів базового класу, до яких звичайний клієнт не має доступу ". Крім того, я рідко бачу випадки використання для захищених членів, які хоча б трохи не підозріло стають перешкодою для обслуговування.
І звичайно, ми мусимо "наслідувати" поліморфізм ОО за допомогою таблиць функціональних покажчиків та покажчиків на них для динамічної відправки з трохи більше котлової панелі, щоб ініціалізувати ці аналогічні vtables
та vptrs
, але трішки котельні ніколи не завдавали мені великого горя.
Спадкування майже однаково. Ми можемо легко моделювати, що за складом і при внутрішній роботі компіляторів це зводиться до того ж самого. Звичайно, ми втрачаємо безпеку типу, якщо ми хочемо знизити збиток , і там я б сказав, якщо ви взагалі хочете бути зривкою , щоб не використовувати для цього C, оскільки те, що люди роблять в C для емуляції спаду, може бути жахливим від типу точки зору безпеки, але я вважаю за краще, щоб люди взагалі не пригнічувались . Безпека типу - це те, що ви можете легко пропустити в C, оскільки компілятор забезпечує стільки свободи інтерпретації речей як просто біти та байти, жертвуючи здатністю ловити потенційні помилки під час компіляції, але деякі мови вважаються об'єктно-орієнтованою ареною навіть не статично набраний.
Так не знаю, я думаю, що це добре. Звичайно, я б не використовував C, щоб намагатися створити масштабну кодову базу, яка відповідає принципам SOLID, але це не обов'язково через його коротких заїздів на об'єктно-орієнтований фронт. Багато можливостей, які я б пропустив, якби я спробував використовувати C для такої мети, був би пов'язаний з мовними особливостями, які безпосередньо не вважаються необхідною умовою OOP, наприклад, безпека сильного типу, деструктори, які автоматично викликаються, коли об'єкти виходять із сфери дії, оператор перевантаження, шаблони / дженерики та обробка виключень. Коли мені не вистачає тих допоміжних функцій, до яких я досягаю C ++.