Что такое Объект с точки зрения ООП?
Говорят что в Си нет объекта, а в C++, Java есть.
Но когда они об этого пишут они приводят пример собаку
class Dog{
public int year;
public int weight;
private boolean sleep{
}
}
Но в Си же тоже можно так делать.
Почему:
typedef struct Dog{
int year;
int weight;
bool sleep{
}
}
Почему в одном случае он объект, а вдругом неОбъект? Это такая же Абстракция. Которая может реализовать наследовние и вроде как полиморфизм (по крайне мере так говорят).
Структура в C - это только данные. А объект в страуступовском ООП - объединение в один компонент и данных, и кода, который эти данные обрабатывает.
Это позволяет достаточно просто разделить программу на набор отдельных компонентов - классов, что упрощает написание кода и дальнейшее внесение изменений в код.
Но даже если в С нет ООП, ничего не мешает его использовать. Добавим в структуру поля - указатели на функции. И получим имитацию виртуальных функций, прекрасно реализующую полиморфизм. Именно такой подход использовался в те времена, когда C++ ещё не было.
Собственно, только полиморфизм в ООП и важен. И всё, что делает ООП - упрощает использование полиморфизма на уровне базовых конструкция языка программирования.
Наследование? - оно создаёт куда больше геморроя, чем решает проблем. Композиция обеспечивает не меньшую гибкость без проблем, создаваемых длинными цепочками наследования.
Инкапсуляция? - достаточно просто не лезть напрямую к полям структур. Тот же JavaScript много лет прекрасно обходился без инкапсуляции. В программировании добровольных соглашений, которых должны придерживаться разработчики, не меньше, чем правил языка программирования. Ну так введём ещё одно такое соглашение.
>Что такое Объект с точки зрения ООП?
Экземпляр класса
>Говорят что в Си нет объекта
Гонят, есть. Равно как ООП. Даже больше - практически весь код на чистом Си написанный профессиональными программистами является объектно-ориентированным.
>Но в Си же тоже можно так делать.
Нельзя
typedef struct Dog{
int year;
int weight;
bool sleep{} // Здесь будет ошибка компиляции. И что здесь вообще подразумевалось?
// метод вида bool sleep() {...} ? Его тоже нельзя вставить
}
В сишных структурах не могут содержаться функции, но могут содержаться указатели на функции. Если же компилировать в режиме c++, то все структуры в плюсах превратятся в классы и туда можно будет засовывать и функции/методы.
В Си нет встроенной поддержки наследования и полиморфизма. Они могут быть без проблем реализованы, первые компиляторы c++ компилировали исходник в другой исходник на языке си, который уже компилировался в машинный как обычно.
Поддержку можно реализовывать руками, но не нужно - ООП может вполне существовать без наследования и полиморфизма, а инкапсуляция в Си проводится не на уровне структуры, а на уровне модуля (пары файлов .h и .c).
Объектоподобность реализуется через структуры и указатели. А ООП — это более высокий уровень абстракций.
Структура задается примерно так:
#include <stdio.h>
#include <stdbool.h>
typedef struct {
int year;
int weight;
bool sleep;
} Dog;
int main() {
Dog my_dog;
my_dog.year = 5;
my_dog.weight = 15;
my_dog.sleep = 1;
printf("Year: %d\n", my_dog.year);
printf("Weight: %d\n", my_dog.weight);
printf("Sleeping: %s\n", my_dog.sleep ? "Yes" : "No");
return 0;
}
>Что такое Объект с точки зрения ООП?
Объект реального мира, выраженный через его свойства и поведение.
>Почему в одном случае он объект, а вдругом неОбъект?
А ты попробуй унаследовать что-нибудь в С или изменить поведение предка - сразу ощутишь разницу.
в СИ нет функций и наследование