Имеет ли C FILE объектно-ориентированный интерфейс?

Используется ли тип FILE, используемый стандартными функциями C fopen и т.д., объектно-ориентированным интерфейсом?

Я ищу мнения с рассуждениями, а не с абсолютным ответом, поскольку определения OO зависят от того, кого вы спрашиваете. Каковы важные концепции ОО, которые они встречают или не встречают?

В ответ на комментарий JustJeff ниже я не спрашиваю, является ли C языком OO, и не позволяет ли C (легко или нет) программировать OO. (Разве это не отдельная проблема?)

Ответ 1

Академически, конечно, фактические файлы - это объекты. У них есть атрибуты, и вы можете выполнять действия над ними. Это не означает, что FILE - это класс, просто говорящий, что есть оо ОУ, о котором нужно подумать.

Проблема с попыткой сказать, что интерфейс stdio FILE квалифицируется как OO, однако, это то, что интерфейс stdio FILE не очень хорошо отражает "объективность" файла. Вы можете использовать FILE под обычным старым C способом OO, но, конечно же, вы теряете синтаксическую ясность, предоставляемую Java или С++.

Далее следует добавить, что, хотя вы не можете генерировать "наследование" из FILE, это дополнительно дисквалифицирует его как OO, но вы можете утверждать, что больше вины его среды (простой C), чем абстрактная идея файл как объект.

На самом деле.. вы, вероятно, могли бы сделать случай, когда FILE является чем-то вроде java-интерфейса. В мире Linux вы можете работать практически с любым устройством ввода-вывода через вызовы open/close/read/write/ioctl; функции FILE - это всего лишь крышки поверх них; поэтому в FILE у вас есть что-то вроде абстрактного класса, который определяет основные операции (open/read/etc) на "устройстве abtact i/o", оставляя его до различных типов производных типов, чтобы их можно было использовать с конкретными типами поведение.

Конечно, очень сложно увидеть OO в куче кода на C и очень легко сломать абстракции, поэтому в наши дни актуальные языки OO настолько популярны.

Ответ 2

Является ли C объектно-ориентированным языком?

Было ли ООП (объектно-ориентированное программирование) чем-то большим, чем лабораторная концепция, когда были созданы C и FILE?

Ответ на эти вопросы ответит на ваш вопрос.

EDIT:

Дальнейшие мысли: Объект Ориентирован конкретно означает несколько видов поведения, в том числе:

Наследование: Можете ли вы получить новые классы из FILE?

Полиморфизм: Можете ли вы обрабатывать производные классы как FILE?

Инкапсуляция: Можете ли вы поместить ФАЙЛ внутрь другого объекта?

Методы и свойства: Имеет ли ФАЙЛ методы и свойства, специфичные для него? (например.           myFile.Name, myFile.Size, myFile.Delete())

Несмотря на то, что есть хорошо известные C "трюки" для выполнения чего-то, похожего на каждое из этих поведений, это не встроено в FILE и не является оригинальным намерением.

Я пришел к выводу, что FILE не является объектно-ориентированным.

Ответ 3

Если тип FILE был "объектно ориентированным", предположительно, мы могли бы извлечь из него какой-то значимый способ. Я никогда не видел убедительного примера такого вывода.

Допустим, у меня новая абстракция оборудования, немного похожая на сокет, называемая червоточиной. Могу ли я получить FILE (или сокет) для его реализации. На самом деле - я, вероятно, должен внести некоторые изменения в таблицы в ядре ОС. Это не то, что я называю ориентацией объектов

Но в конце концов вся эта проблема сводится к семантике. Некоторые люди утверждают, что все, что использует таблицу перехода, ориентировано на объекты, и IBM всегда утверждала, что их блоки AS/400 объектно-ориентированные, сквозные.

Для тех из вас, кто хочет окунуться в яму безумия и глупости, которая является новостной группой USENET comp.object, эта тема обсуждалась довольно подробно там несколько лет назад, хотя и безумными и глупыми людьми. Если вы хотите тралить эти глубины, то Google Groups - это хорошее место для начала.

Ответ 4

Нет. C не является объектно-ориентированным языком.

Я знаю, что "абсолютный ответ", который вам не нужен, но я боюсь, что это единственный ответ. Причиной является то, что C не является объектно-ориентированным, поэтому никакая его часть не может иметь "объектно-ориентированный интерфейс".

Разъяснение:

По моему мнению, истинная объектная ориентация включает в себя отправку метода через политип подтипа. Если язык не имеет этого, он не является объектно-ориентированным.

Объектная ориентация не является "техникой", как GTK. Это языковая функция. Если язык не имеет этой функции, он не является объектно-ориентированным.

Если объектная ориентация была просто техникой, то почти каждый язык можно было бы назвать объектно-ориентированным, и этот термин перестанет иметь какой-либо реальный смысл.

Ответ 5

Это зависит. Как вы определяете "объектно-ориентированный интерфейс"? Как показывают комментарии к abelenky post, легко построить аргумент, который FILE является объектно-ориентированным. Это зависит от того, что вы подразумеваете под "объектно-ориентированным". У него нет каких-либо методов-членов. Но у него есть функции, характерные для него.

Он не может быть получен из "обычного" смысла, но он кажется полиморфным. За указателем FILE реализация может сильно различаться. Это может быть файл, это может быть буфер в памяти, это может быть сокет или стандартный вывод.

Он инкапсулирован? Ну, это по существу реализовано как указатель. Нет доступа к деталям реализации, где находится файл, или даже имя файла, если вы не назовете на нем правильные функции API. Это звучит для меня.

Ответ - это в основном то, что вы хотите. Если вы не хотите, чтобы FILE был объектно-ориентированным, определите "объектно-ориентированный" таким образом, что FILE не может выполнить.

Ответ 6

C имеет первую половину ориентированного объекта. Инкапсуляция, т.е. У вас могут быть составные типы, такие как FILE * или structs, но вы не можете наследовать их, что является второй (хотя и менее важной) половиной

Ответ 7

Существуют разные определения оо. Наиболее полезным я считаю следующее (вдохновленное Аланом Кей):

  • объекты сохраняют состояние (т.е. ссылки на другие объекты)
  • объекты получают (и обрабатывают) сообщения
  • обработка сообщения может привести к
    • сообщения отправляются самому объекту или другим объектам
    • изменение состояния объекта

Это означает, что вы можете программировать объектно-ориентированным способом на любом императивном языке программирования - даже на ассемблере. Чистофункциональный язык не имеет переменных состояния, что делает невозможным или, по крайней мере, неудобно реализовать (помните: LISP не является чистым!); то же самое следует использовать для чисто декларативных языков.

В C передача сообщений чаще всего выполняется как вызовы функций с указателем на структуру, содержащую состояние объекта в качестве первого аргумента, что имеет место для обработки файлов api. Тем не менее, C как язык нельзя классифицировать как оо, поскольку он не имеет синтаксической поддержки для этого стиля программирования.

Кроме того, некоторые другие определения оо включают в себя такие вещи, как наследование на основе классов (так что о прототипальных языках?) и инкапсуляция - которые на самом деле не очень важны, но некоторые из них могут быть реализованы на языке C с некоторым указателем - и магия заклинаний.