Рубріки: Теория

Objective-C: про полиморфизм понятным языком

Игорь Грегорченко

Слово «полиморфизм» означает наличие множества форм. Обычно полиморфизм возникает, когда существует иерархия классов и они связаны между собой наследованием.

Полиморфизм Objective-C означает, что вызов функции-члена вызовет выполнение другой функции в зависимости от типа объекта, вызывающего функцию.

Базовая теория

Полиморфизм — способность различных объектов реагировать на одно и то же сообщение по-своему называется полиморфизмом.

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

Переменные экземпляра класса и методы класса имеют следующие характеристики:

  • Подобно членам данных в структуре языка Cи, переменные экземпляра класса также располагаются в уникальном пространстве имен класса.
  • Методы класса также расположены в уникальном пространстве имен класса. В отличие от имени метода в языке Си, имя метода класса не является глобальным символом. Имя метода в одном классе не будет конфликтовать с тем же именем метода в других классах. Два совершенно разных класса могут реализовать один и тот же метод.

Имя метода является частью интерфейса объекта. Имя сообщения, полученного объектом, является именем вызванного метода. Поскольку разные объекты могут иметь методы с одинаковым именем, объект должен уметь понимать смысл сообщения. Одно и то же сообщение посылается разным объектам, что приводит к различным операциям.

Простой пример реализации полиморфизма

Но довольно сухой теории, давайте рассмотрим сразу пример: у нас есть класс Shape, который предоставляет базовый интерфейс для всех фигур. Квадрат и прямоугольник являются производными от базового класса Shape.

Далее, у нас есть метод printArea, который покажет особенность ООП — полиморфизм.

#import <Foundation/Foundation.h>

@interface Shape : NSObject {
   CGFloat area;
}

- (void)printArea;
- (void)calculateArea;
@end

@implementation Shape
- (void)printArea {
   NSLog(@"The area is %f", area);
}

- (void)calculateArea {

}

@end

@interface Square : Shape {
   CGFloat length;
}

- (id)initWithSide:(CGFloat)side;
- (void)calculateArea;

@end

@implementation Square
- (id)initWithSide:(CGFloat)side {
   length = side;
   return self;
}

- (void)calculateArea {
   area = length * length;
}

- (void)printArea {
   NSLog(@"The area of square is %f", area);
}

@end

@interface Rectangle : Shape {
   CGFloat length;
   CGFloat breadth;
}

- (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth;
@end

@implementation Rectangle
- (id)initWithLength:(CGFloat)rLength andBreadth:(CGFloat)rBreadth {
   length = rLength;
   breadth = rBreadth;
   return self;
}

- (void)calculateArea {
   area = length * breadth;
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   Shape *square = [[Square alloc]initWithSide:10.0];
   [square calculateArea];
   [square printArea];
   Shape *rect = [[Rectangle alloc]
   initWithLength:10.0 andBreadth:5.0];
   [rect calculateArea];
   [rect printArea];        
   [pool drain];
   return 0;
}

 

Когда приведенный выше код компилируется и выполняется, он выдает следующий результат —

2013-09-22 21:21:50.785 Polymorphism[358:303] The area of square is 100.000000
2013-09-22 21:21:50.786 Polymorphism[358:303] The area is 50.000000

В приведенном выше примере на основе наличия метода calculateArea и printArea выполняется либо метод в базовом классе, либо в производном классе.

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

Подведем итоги

Полиморфизм является одной из основных концепций объектно-ориентированного программирования (ООП) и описывает ситуации, в которых что-то существует в нескольких различных формах.

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

Итак, полиморфизм — это идея о том, что код, который выполняется при отправке сообщения объекту, зависит как от класса получателя, так и от имени метода в сообщении. В традиционных процедурных языках код, выполняемый при вызове функции, определяется только именем функции.

Полиморфизм обеспечивает переключение методов между базовым и производным классом на основе реализации методов этих двух классов.

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

Таким образом, интерфейс программирования представляет собой набор абстрактных моделей поведения, которые отличаются от классов, реализующих интерфейс.

Objective-C поддерживает полиморфизм имен методов, но не поддерживает полиморфизм параметров и операторов.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023