Мне просто интересно, какие именно функции должен предоставлять язык или библиотека, чтобы его можно было определить как «объектно-ориентированный». Является ли объектная ориентация чем-то, чего можно более или менее достичь в любом языке программирования общего назначения с приличными функциями? Или это может быть достигнуто только в тех языках, которые специально рекламируют, что они поддерживают объектно-ориентированное программирование?
Например, посмотрите на следующий код C:
SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE);
SDL_FreeSurface( screen );
или код, обсуждаемый здесь .
Теперь вышеприведенный код не использует наследование, полиморфизм времени выполнения (?), Виртуальные функции и т. Д. Но мне кажется, что это ООП.
Является ли Object-Orientation простым написанием кода, основанного на создаваемых и разрушаемых структурах данных, таких как объекты, классы, структуры и т. Д., Для которых не требуется какой-либо особый шаблон или функции, предоставляемые языком программирования или библиотекой ?
источник
1+2
действительно является объектно-ориентированным. Это конструктор, который строит новый объект из двух существующих объектов. Использование примеров кода ничего не показывает.Ответы:
По словам Алана Кея, который придумал термин «объектно-ориентированный»,
Обмен сообщениями (как реализовано в Smalltalk) является концепцией, сравнимой с полиморфизмом, но более мощной (по крайней мере, чем полиморфизм, поддерживаемый C ++ или Java). Это может быть сделано на всех языках, но довольно болезненно, если не поддерживается непосредственно языком. По сути, это означает, что объекты могут отправлять друг другу сообщения, содержащие что-либо, amd может реагировать, как они хотят, на сообщения, которые они получают. Чтобы полностью поддерживать обмен сообщениями, у объектов должен быть способ гибко реагировать на сообщения, не перечисляя их в исходном коде (что, в основном, и делают определения методов / функций).
Локальное сохранение, защита и сокрытие процесса состояний - инкапсуляция AKA - может быть сделано условно на всех языках, но это несколько обманывает. Локальное удержание на уровне языка, по-видимому, является единственной функцией всех языков, которые утверждают, что разделяют ОО (и многие не разделяют) - обычно существует способ создания составных типов данных с несколькими экземплярами. Защита и сокрытие, с другой стороны, часто осуществляются только условно.
поздняя привязка всех вещей - скользящая шкала, в которой C действительно далек от видения Кей (как и C ++, в то время как Java гораздо ближе). Может быть подделан (см. COM), но это будет боль в использовании.
Обратите внимание, как Кей не упоминает о наследовании . В том же письме он написал
источник
Объектно-ориентированное программирование - это не синтаксические особенности, это философия кодирования и дизайна. В его основе лежит концепция объекта , который представляет собой конструкцию, которая группирует состояние с помощью подпрограмм, чтобы воздействовать на него (или, в зависимости от вашей точки зрения, на ответы на сообщения). Другим важным аспектом ООП является инкапсуляция : упаковка деталей реализации в непрозрачные структуры и их соединение через четко определенные интерфейсы. Практически все остальное в теории ООП восходит к этим двум основам.
Таким образом, любой язык, который может каким-либо образом моделировать объекты (объекты, которые содержат как данные, так и код) и инкапсуляцию, может использоваться для ООП. Например, в C вы можете использовать указатели функций для хранения функций в структурах, и вы можете использовать файловую систему заголовка / исходного кода для реализации инкапсуляции. Это не удобно, но достаточно сделать ООП. Вы, вероятно, даже можете согнуть что-то вроде Haskell или ML для выполнения ООП, и я не удивлюсь, если кто-нибудь сможет придумать способ выполнения ООП в сборке.
Однако на практике язык можно назвать «объектно-ориентированным», если он предоставляет полный набор синтаксических функций для явного объектно-ориентированного программирования. Как правило, это означает, что такой язык должен иметь: * понятие объекта * понятие вызова метода или передачи сообщений * удобный и простой способ управления доступом к элементам объекта * удобный и простой способ определения интерфейсов
Следовательно, я бы назвал кусок кода объектно-ориентированным, если он придерживается принципов ООП и использует доступный синтаксис ООП.
Кстати, ваш пример кода, вероятно , использует полиморфизм и виртуальные функции, хотя синтаксис C не делает это очевидным. Я не эксперт по SDL, но я ожидаю, что
SDL_surface
у меня будет возможность представлять различные типы поверхностей, каждая со своим собственным конкретным набором реализаций. код, но интерфейс (функции, которые принимаютSDL_surface*
в качестве аргумента) остается прежним. Точно так же, он также реализует инкапсуляцию: вы не можете получить прямой доступ к базовому представлению поверхности, вам нужно пройти через функции, которые знают, как обрабатыватьSDL_surface
, потому что это все, что у вас есть. Это хороший пример того, как вы делаете ООП в C.источник
Я понимаю, что ОО - это способ мышления и реализация, основанная на идее, что вычислительная задача может быть достигнута одним работником (объектом) или взаимодействием отдельных работников (объектов) посредством передачи сообщений между этими работниками ( объекты) во время выполнения. Это поведение во время выполнения требует твердой статической и динамической конструкций для его включения.
Конкретный синтаксис для реализации ОО не является ключом, который определяет, является ли язык ОО или нет. Например, Smalltalk и C # имеют разные синтаксисы, но оба являются языками ОО (в разной степени). Ключ в том, сохраняет ли данный язык философию (см. Выше) и обеспечивает ли он необходимые средства для имплантации.
источник
Когда я был студентом, меня учили, что объектно-ориентированное программирование стоит на трех столпах:
Язык должен поддерживать эти функции , чтобы считаться объектно-ориентированным языком.
Обратите внимание, что это описывает набор функций, а не синтаксис . Следовательно, нужно ли вам писать
или
не имеет значения
Таким образом, вы действительно можете программировать в соответствии с объектно-ориентированной парадигмой на C. Но язык не поддерживает этого, что делает его довольно болезненным упражнением. Вот почему C не считается объектно-ориентированным языком.
источник
Вы можете делать ОО на любом приличном языке общего назначения.
Это легче сделать это в «ОО» языке, потому что у вас есть идиоматические конструкции доступны и не должны прибегать к чему - то , как OO в C - что это возможно, но и страшен.
Предоставляются ли ОО-конструкции самим языком, его стандартной библиотекой или какой-либо другой библиотекой, не имеет большого значения, поскольку некоторые языки (например, Scala) позволяют библиотекам добавлять языковые конструкции, так что с точки зрения программиста это практически невозможно различать, какие вещи предоставляет основной язык, а какие - библиотека.
источник
Если вы посмотрите на диапазон языков, которые были широко приняты как ОО, и те, которые не имеют, тест, кажется, поддерживает полиморфизм включения (он же полиморфизм подтипа, но полиморфизм включения - это термин, используемый Карделли в статья, которая познакомила меня и многих других с классификацией видов полиморфизма). IE возможность для некоторых переменных иметь значения разных типов и возможность для некоторых вызовов отправлять различные подпрограммы в зависимости от типа одного или нескольких значений. Все остальное присутствовало на языках, не принятых как ОО, или отсутствовало на языках, хорошо принятых как ОО.
Две основные другие характеристики, связанные с ОО-языками, были предоставлены не ОО-языками:
источник
Ориентация объекта определяется как
также проверьте записи википедии. это те особенности, которые язык должен обеспечивать, чтобы он был определен как объектно-ориентированный.
Рассмотрим ваш объектно-ориентированный код, если он написан на объектно-ориентированном языке программирования. даже если вы напишите что-то процедурное, оно будет воздействовать на методы в объектах из классов, используя полиморфизм через инкапсуляцию [возможно] :)
относительно вашего последнего вопроса ответ, вероятно, да. объектно-ориентированный в основном просто действует на методы объектов и передает эти объекты в качестве параметров.
источник