Глава 1: Основы программирования ← Вернуться к списку глав Глава 3: Изучение синтаксиса Objective-C

Глава 2: Объектно-ориентированное программирование (ООП)

Добро пожаловать во вторую главу нашего увлекательного путешествия в мир программирования на Objective-C! В этой главе мы познакомимся с одной из самых важных концепций в современном программировании — объектно-ориентированным программированием или просто ООП. Не пугайтесь сложных терминов — мы объясним все на простых примерах, чтобы вы легко во всем разобрались.


2.1. Что такое объектно-ориентированное программирование?

Представьте мир как набор объектов

Объектно-ориентированное программирование — это способ думать о программах, как о наборах взаимодействующих объектов. Каждый объект имеет свои свойства (характеристики) и методы (действия).

Пример из жизни:

В ООП мы создаем такие объекты в коде и заставляем их взаимодействовать между собой.


2.2. Классы и объекты

Класс — это шаблон, объект — это экземпляр

Пример:

Создание класса в Objective-C

Давайте создадим простой класс в Objective-C.

Шаг 1: Объявление класса (интерфейс)

@interface Person : NSObject

// Свойства
@property NSString *name;
@property int age;

// Методы
- (void)sayHello;

@end

Шаг 2: Реализация класса

@implementation Person

- (void)sayHello {
    NSLog(@"Привет! Меня зовут %@.", self.name);
}

@end

Создание объекта класса

Теперь создадим объект нашего класса и используем его.

Person *person = [[Person alloc] init];
person.name = @"Иван";
person.age = 30;

[person sayHello]; // Вывод: "Привет! Меня зовут Иван."

2.3. Свойства и методы

Свойства (Properties)

Свойства позволяют хранить данные внутри объекта. В Objective-C они объявляются с помощью @property.

Пример:

@property NSString *name;
@property int age;

Методы

Методы — это действия, которые может выполнять объект.

Объявление метода:

- (возвращаемый_тип)имяМетода;

Пример:

- (void)sayHello;

2.4. Инкапсуляция

Что это такое?

Инкапсуляция — это принцип ООП, который подразумевает скрытие внутренней реализации объекта от внешнего мира. Другими словами, мы можем управлять доступом к данным объекта.

Сеттеры и геттеры

В Objective-C, благодаря @property, сеттеры и геттеры создаются автоматически.

Пример:

person.name = @"Мария"; // Используется сеттер
NSString *personName = person.name; // Используется геттер

2.5. Наследование

Что такое наследование?

Наследование позволяет одному классу наследовать свойства и методы другого класса. Это похоже на то, как дети наследуют черты от родителей.

Пример наследования

Создадим класс Student, который наследует от Person.

Объявление:

@interface Student : Person

@property NSString *university;

- (void)study;

@end

Реализация:

@implementation Student

- (void)study {
    NSLog(@"%@ учится в %@.", self.name, self.university);
}

@end

Использование наследования

Student *student = [[Student alloc] init];
student.name = @"Алексей";
student.age = 20;
student.university = @"МГУ";

[student sayHello]; // Метод из класса Person
[student study];    // Метод из класса Student

2.6. Полиморфизм

Что это такое?

Полиморфизм — это способность объектов принимать разные формы. В программировании это означает, что объект подкласса может использоваться там, где ожидается объект родительского класса.

Пример полиморфизма

Представим, что у нас есть массив людей, и мы хотим, чтобы каждый из них представился.

Person *person1 = [[Person alloc] init];
person1.name = @"Иван";

Student *student1 = [[Student alloc] init];
student1.name = @"Мария";
student1.university = @"СПбГУ";

NSArray *people = @[person1, student1];

for (Person *person in people) {
    [person sayHello];
}

2.7. Переопределение методов

Что это такое?

Переопределение позволяет подклассу изменить реализацию метода, унаследованного от родительского класса.

Пример переопределения

Добавим в класс Student свой вариант метода sayHello.

@implementation Student

- (void)sayHello {
    NSLog(@"Привет! Я студент по имени %@.", self.name);
}

- (void)study {
    NSLog(@"%@ учится в %@.", self.name, self.university);
}

@end

Теперь, когда мы вызываем [student sayHello], будет использоваться переопределенный метод из класса Student.


2.8. Классовые методы

Экземплярные методы vs Классовые методы

Пример классового метода:

@interface MathUtility : NSObject

+ (int)addNumber:(int)a toNumber:(int)b;

@end

@implementation MathUtility

+ (int)addNumber:(int)a toNumber:(int)b {
    return a + b;
}

@end

Использование:

int sum = [MathUtility addNumber:5 toNumber:7]; // sum будет 12

2.9. Категории

Что такое категории?

Категории позволяют добавлять новые методы в существующие классы без изменения их исходного кода и без наследования.

Пример использования категории

Допустим, мы хотим добавить метод к классу NSString.

Объявление категории:

@interface NSString (MyCategory)

- (void)sayString;

@end

Реализация категории:

@implementation NSString (MyCategory)

- (void)sayString {
    NSLog(@"%@", self);
}

@end

Использование:

NSString *myString = @"Привет, категория!";
[myString sayString]; // Вывод: "Привет, категория!"

2.10. Протоколы

Что такое протоколы?

Протоколы определяют набор методов, которые класс может (или должен) реализовать. Это похоже на контракт: если класс соглашается следовать протоколу, он обязуется реализовать его методы.

Пример протокола

Объявление протокола:

@protocol Drivable <NSObject>

- (void)startEngine;
- (void)stopEngine;

@end

Класс, реализующий протокол:

@interface Car : NSObject <Drivable>

@property NSString *model;

@end

@implementation Car

- (void)startEngine {
    NSLog(@"Двигатель запущен.");
}

- (void)stopEngine {
    NSLog(@"Двигатель остановлен.");
}

@end

Использование:

Car *myCar = [[Car alloc] init];
myCar.model = @"Tesla Model S";

[myCar startEngine];
[myCar stopEngine];

Заключение

Отлично! Вы познакомились с основами объектно-ориентированного программирования в Objective-C. Теперь вы знаете, что такое классы и объекты, как создавать и использовать их, а также понимаете ключевые концепции ООП: инкапсуляцию, наследование и полиморфизм.


Практические задания

Задание 1: Класс "Животное"

  1. Создайте класс Animal со свойствами name (имя) и age (возраст).
  2. Добавьте метод makeSound, который будет выводить в консоль звук животного.
  3. Создайте подклассы Dog и Cat, которые наследуют от Animal.
  4. В подклассах переопределите метод makeSound, чтобы он выводил "Гав!" для собаки и "Мяу!" для кошки.
  5. Создайте объекты каждого класса и вызовите их методы.

Пример:

Dog *dog = [[Dog alloc] init];
dog.name = @"Бобик";
[dog makeSound]; // Вывод: "Гав!"

Cat *cat = [[Cat alloc] init];
cat.name = @"Мурка";
[cat makeSound]; // Вывод: "Мяу!"

Задание 2: Калькулятор с протоколом

  1. Создайте протокол Calculatable с методами add:, subtract:, multiplyBy: и divideBy:.
  2. Создайте класс Calculator, который реализует этот протокол.
  3. Реализуйте методы протокола для выполнения соответствующих операций.
  4. Создайте объект Calculator и продемонстрируйте работу методов.

Пример:

Calculator *calculator = [[Calculator alloc] init];

int resultAdd = [calculator add:5 to:3]; // resultAdd будет 8
int resultSub = [calculator subtract:2 from:10]; // resultSub будет 8

Задание 3: Категория для NSString

  1. Создайте категорию для NSString, которая добавляет метод reverseString.
  2. Метод должен возвращать новую строку, являющуюся перевернутой исходной строкой.
  3. Продемонстрируйте использование этого метода.

Пример:

NSString *originalString = @"Objective-C";
NSString *reversedString = [originalString reverseString]; // reversedString будет @"C-evitcejbO"

Продолжение следует...

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

Не забывайте практиковаться! Создавайте свои классы, экспериментируйте с наследованием и полиморфизмом. Чем больше вы будете писать код, тем лучше будете понимать принципы ООП.

Удачи и до встречи в следующей главе!

Глава 1: Основы программирования ← Вернуться к списку глав Глава 3: Изучение синтаксиса Objective-C

Просмотров: 46