Продолжаем наши уроки.
В прошлый раз мы говорили об основах языка Objective-C и о том, что такое объект и класс.
Сегодня мы узнаем о наследовании и научимся создавать свои классы.
Наследование
Как мы помним, есть понятие класса. Класс - это концепция, описывающая совокупность объектов с одинаковым набором свойств и методов. Например, класс кнопок - у всех кнопок есть надпись, ширина, высота (свойства) и "нажать", "нарисовать себя" (методы).
Соответственно, каждая кнопка - это объект класса "кнопка".
Если брать примеры из реальной жизни, то есть класс "легковая машина", например.
Это, надеюсь, вы помните с прошлого урока :)
Теперь давайте посмотрим на два объекта - на кнопку и на текстовое поле.
Хотя они и предназначены для разных вещей, имеют разные наборы методов и свойств, но в чем-то они похожи. Например, и у кнопки, и у текстового поля есть координаты на экране, их ширина и высота, они оба реагируют на нажатия.
Если обратиться к реальной жизни, то можно вспомнить легковую и грузовую машины. Безусловно, они предназначены для разных целей, но у них есть схожие черты и методы.
Обе машины - легковую и грузовую - можно назвать общим словом "машина".
По сути, мы можем сказать, что есть общий класс "машина", а есть более конкретные классы (легковая машина, грузовая машина). У общего класса "машина" есть некоторые сходства с мотоциклом и с моторной лодкой (и то, и другое, и третье используются для передвижения человека в пространстве с использованием мотора). Это значит, что у этих трех классов есть более общий класс "транспортное средство".
Это и есть наследование - каждый более конкретный класс содержит в себе свойства более общего класса (легковой автомобиль есть машина, машина есть транспортное средство), при этом конкретный класс добавляет свои свойства (легковой автомобиль = машина + небольшой размер, машина = транспортное средство + сухопутное + на четырех колесах).
Аналогично и для кнопки и текстового поля - и то, и другое наследуются от общего класса "элемент управления" (UIControl), тот в свою очередь является предком "вида" UIView. Вид - это просто прямоугольное пространство на экране, которое может быть отображено и которое содержит в себе другие элементы.
В Objective-C построена очень большая иерархия классов. Если спускаться от самых конкретных (от той же кнопки UIButton), вниз, к более общим, то в самом низу мы встретимся с базовым классом, который называется NSObject.
Любой класс наследуется от него.
Наш собственный класс
Для создания класса, нажмите правой кнопкой на группе, в которую хотите его поместить и выберите New File:
Выбираем Cocoa Touch - Objective-C class:
Введите название, я выбрал "MyClass", в строке Subclass of (наследник какого класса) выбираем NSObject - будем наследоваться от самого базового класса.
Отлично.
Теперь о файлах .h и .m.
Файл myclass.h называется заголовочным файлом (header, хэдер) - в нем хранится информация о классе, а именно: его список свойств и методов, доступных другим классам.
У нас он содержит следующие строки:
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
@end
Это - базовое объявление класса. Первая строка означает, что мы импортируем классы Foundation - по сути, все основные классы Objective-C типа строк, чисел и т.д. содержатся там.
Далее, мы объявляем интерфейс - то есть список доступных методов и свойств нашего класса - ключевым словом @interface и пишем название класса MyСlass, а через двоеточние - название класса, от которого наследуемся.
@end, как не сложно догадаться, завершает описание интерфейса.
Давайте сделаем что-нибудь простое. Например, пусть у нашего класса будет свойство "описание", в котором мы будем хранить его текстовое описание + у него будет метод "поздороваться", который будет выводить в консоль сообщение "Hello, World!".
Не густо, но для начала пойдет :)
Добавим в интерфейс описание метода и свойства:
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
-(void)sayHi;
@property (nonatomic, retain) NSString *myText;
@end
Вот так.
Сначала мы объявили метод sayHi, который будет печатать сообщение Hello, world.
Напомню, что, поскольку он не принимает никаких параметров, то двоеточий в нем нет. И, поскольку он не возвращает никаких данных, то мы пишем -(void) перед началом метода.
Далее идет объявление свойства.
Пока что мы не будем подробно разбирать его - достаточно сказать, что у нас есть объект класса строка (NSString), на который будет ссылаться указатель под названием myText.
Давайте заглянем в MyClass.m:
#import "MyClass.h"
@implementation MyClass
@end
Не густо :) Первая строка указывает на описание класса, находящееся в хэдера.
А далее мы пишем @implementation, чтобы показать, что тут будет код методов.
Изменим его, чтобы он выглядел следующим образом:
#import "MyClass.h"
@implementation MyClass
@synthesize myText;
-(void)sayHi
{
NSLog(@"Hello, world!");
}
@end
Про @synthesize мы пока говорить не будем, разве что вкратце скажу - он вместо нас генерирует код, который позволит другим объектам "читать" содержимое строки myText и устанавливать его.
Дальше мы пишем метод sayHi, очень простой и понятный :) Он просто выводит текст в консоль командой NSLog.
Давайте теперь добавим на нашу форму кнопку и привяжем к ней метод askForHi.
Как добавлять новый метод во ViewController, вы должны знать из старых уроков - поэтому добавьте его, чтобы он выглядел так (из ViewController.m):
-(IBAction)askHi:(id)sender
{
}
И не забудьте привязать его к кнопке! :)
На самый верх ViewController.m добавьте строчку:
#import "MyClass.h"
Эта строчка расскажет классу ViewController, что есть класс MyClass.
Теперь вернемся к нашему методу:
-(IBAction)askHi:(id)sender
{
MyClass *obj = [[MyClass alloc] init];
[obj sayHi];
obj.myText = @"Some text";
}
Первая строка создает объект класса MyClass. О создании объекта - в следующих уроках, для начала будем знать, что объект создается именно так.
Затем мы вызываем метод sayHi, а в третьей строке записываем текст в строку.
Теперь, если запустить приложение и нажать на кнопку, то в консоли у вас появится строка Hello, world:
На этом я заканчиваю наш урок - надеюсь, у вас все получилось, а если есть вопросы - прошу в комменты.
На следующем уроке, со всеми нашими знаниями, мы разработаем первый, действительно рабочий проект :) который пригодится в хозяйстве)
Понимаю что времени писать наверно нет, но очень бы хотелось почаще уроки, может лучше понемногу, пусть просто про какие то зарезервированные слова, зато подробно и с примером, а когда будет время уже писать какой нибудь проект посложней, со ссылками на предыдущие статьи, где можно ознакомится?
ОтветитьУдалитьДа, Игорь, я думаю, что вы правы и наверное лучше делать уроки поменьше, но чаще - просто конкретно про Objective-C хотелось написать сразу и много :)
Удалить