Форум программистов, компьютерный форум, киберфорум
Objective-C
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138

Переопределение метода в сабклассе делегата

25.10.2014, 18:05. Показов 2567. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сабж. Есть класс1, реализует некий метод некого протокола. Как в классе 2(наследник класса1) переопределить этот метод (не считая категории и обьявления протокола класса1 и его реализации в классе2)?
Неужели нельзя переопределить просто при насаледовани?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2014, 18:05
Ответы с готовыми решениями:

При сравнении экземпляра делегата с именем метода, имя метода преобразуется автоматически в делегат или нет?
Добрый день. Есть несколько вопросов про событий и делегаты: 1) При сравнении экземпляра делегата с именем метода, имя метода...

Вызов метода(делегата) из неуправляемого кода
Есть способ передать адрес делегата в неуправляемый код как адрес функции, кто нибудь решил эту задачу для использования в своих проектах?...

Запретить передачу частного метода посредством делегата
Как запретить такое поведение ? using System; namespace ConsoleApplicationNS2 { using ConsoleApplicationNS1; public class...

12
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
25.10.2014, 23:42
Есть класс1, реализует некий метод некого протокола. Как в классе 2(наследник класса1) переопределить этот метод (не считая категории и объявления протокола класса1 и его реализации в классе2)?
По точнее.
Если просто сделать override метода то просто

Objective-C
1
2
3
4
-(void) method {
    [super method]; // << вызов родительского method
    // дополнительный код
}
Для категорий делать подобное недопустимо, разрешается объявлять только новые методы

Добавлено через 3 минуты
Есть класс1, реализует некий метод некого протокола
Сам по себе протокол ничего не содержит. Следовательно можно переопределить (override) любой метод в наследуемом классе строчками указанными выше.
0
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
26.10.2014, 05:06  [ТС]
Неа. Всё равно в подклассе нужный метод не вызывается.
Есть класс, который подготавливает запрос NSURLConnection и реализовывает все его методы.
GetData.h
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@interface GetData : NSObject <NSURLConnectionDelegate>
 
-(void)getDataFromURL:(NSString *)url
        isPostRequest:(BOOL)isPostRequst
           parameters:(NSString *)parameters
             delegate:(id)delegate
     showActivityView:(BOOL)showActivity;
 
@property (nonatomic, assign) id delegate;
@property (nonatomic, assign) int tag;
 
@end
 
@protocol GetDataDelegate
 
@optional
-(void)getData:(GetData*)getData succeededWithData:(NSMutableData*)receivedData;
-(void)getData:(GetData*)getData FailedWithError:(NSString*)error;
 
@end
Есть абстрактный класс, который явлается наследником UIViewController
MapScreen.h
Objective-C
1
2
3
4
@interface MapScreen : UIViewController <GMSMapViewDelegate, GetDataDelegate>
@property (weak, nonatomic) IBOutlet GMSMapView *mapView;
-(id)init;
@end
MapScreen.m
Objective-C
1
2
3
4
5
6
7
8
9
10
11
//где то в коде
GetData *getNewPlacemarks = [[GetData alloc]init];
[getWashes getDataFromURL:@""
                    isPostRequest:NO
                       parameters:[NSString stringWithFormat:@"start_lat=%f&start_lon=%f&end_lat=%f&end_lon=%f", startLat, startLon, endLat, endLon]
                         delegate:self
                 showActivityView:YES];
//где то вызывается метод, о неудачном соединении
-(void)getData:(GetData *)getData FailedWithError:(NSString *)error{
    //что то там
}
И, наконец, есть конкретный подкласс ArriveNow.
ArriveNow.h
Objective-C
1
2
@interface ArriveNow : MapScreen
@end
В котором нужно переопределить метод
Objective-C
1
-(void)getData:(GetData *)getData FailedWithError:(NSString *)error
Но в этом классе не вызывается ни один один наследованный метод, кроме init (его я переопределил)
0
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
26.10.2014, 05:49
@property (nonatomic, assign) id delegate;
Все делегаты должны быть WEAK ссылками! c указанием какой протокол они делегируют

@property (weak, nonatomic) id<GetDataDelegate> delegate;
чтобы прокотол был виден до его объвляния достаточно написать

@protocol GetDataDelegate;

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@protocol GetDataDelegate;
 
@interface GetData : NSObject <NSURLConnectionDelegate>
 
-(void)getDataFromURL:(NSString *)url
        isPostRequest:(BOOL)isPostRequst
           parameters:(NSString *)parameters
             delegate:(id<GetDataDelegate>)delegate
     showActivityView:(BOOL)showActivity;
 
@property (weak, nonatomic) id<GetDataDelegate> delegate;
@property (nonatomic) int tag;
 
@end
 
// <<
 
@protocol GetDataDelegate
 
@optional
-(void)getData:(GetData*)getData succeededWithData:(NSMutableData*)receivedData;
-(void)getData:(GetData*)getData FailedWithError:(NSString*)error;
 
@end
---------

покажи исходный код где вызываешь у делегата "события"
1
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
26.10.2014, 07:44  [ТС]
Цитата Сообщение от noname_club Посмотреть сообщение
покажи исходный код где вызываешь у делегата "события"
GetData.m
Objective-C
1
2
3
4
5
6
7
8
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    receivedData = nil;
    [self hideActivityWithOverlay];
    if ([self.delegate respondsToSelector:@selector(getData:FailedWithError:)]) {
        [self.delegate getData:self FailedWithError:[error localizedDescription]];
    }
 
}
MapScreen.m
Objective-C
1
2
3
-(void)getData:(GetData *)getData FailedWithError:(NSString *)error{
    NSLog(@"method called from parent");
}
А у наследника MapScreen он не вызывается
0
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
26.10.2014, 11:24
Objective-C
1
2
3
if ([self.delegate respondsToSelector:@selector(getData:FailedWithError:)]) {
        [self.delegate getData:self FailedWithError:[error localizedDescription]];
    }
брейкпоинт поставь и проверь действительно ли все работает.

Objective-C
1
connection:(NSURLConnection *)connection didFailWithError
Чтобы NSURLConnection вернуло fail надо просто поднять firewall
0
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
26.10.2014, 11:46  [ТС]
Цитата Сообщение от noname_club Посмотреть сообщение
брейкпоинт поставь и проверь действительно ли все работает.
всё работает, проверял неоднократнно. метод вызывается у родителя, а у наследника - нет.
0
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
26.10.2014, 11:57
истина где рядом брейкпоинте лучше.
Проверьте дейтвительно ли экзепмляр того класса вызываете.
0
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
26.10.2014, 12:10  [ТС]
Цитата Сообщение от noname_club Посмотреть сообщение
Проверьте дейтвительно ли экзепмляр того класса вызываете.
вызываю экземпляр наследника.
но соединение инициализирую в родителе. может тут где то собака зарылась?
0
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
28.10.2014, 07:29  [ТС]
Цитата Сообщение от noname_club Посмотреть сообщение
Проверьте дейтвительно ли экзепмляр того класса вызываете.
Вернулся к этой проблеме, выяснил, что при иницализации возвращается экземпляр класса родителя.
По сути:
Инит в родителе.
Objective-C
1
2
3
4
5
6
-(id)init{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    self = [storyboard instantiateViewControllerWithIdentifier:@"MapScreen"];
    if (!self) return nil;
    return self;
}
инит в наследнике
Objective-C
1
2
3
4
5
-(id)init{
    self = [super init];
    if (!self) return nil;
    return self;
}
Пытался так же тип явно преобразовать, всё равно возвращается экземпляр класса родителя.
Что я делаю не так?
0
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
28.10.2014, 07:40
Objective-C
1
2
3
4
5
6
-(id)init{
* * UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
* * self = [storyboard instantiateViewControllerWithIdentifier:@"MapScreen"];
* * if (!self) return nil;
* * return self;
}
Ну так бред же написан. -init вызывается у уже созданного объекта с помощью +alloc, и он должен возвращать тот же указатель, что и +alloc (или nil, если все плохо). А у вас сначала создается экземпляр наследника, игнорируется, затем в ините создается новый экземпляр из сториборда, где скорее всего указан класс-родитель.
1
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
28.10.2014, 07:59  [ТС]
Цитата Сообщение от glvrzzz Посмотреть сообщение
Ну так бред же написан. -init вызывается у уже созданного объекта с помощью +alloc, и он должен возвращать тот же указатель, что и +alloc (или nil, если все плохо). А у вас сначала создается экземпляр наследника, игнорируется, затем в ините создается новый экземпляр из сториборда, где скорее всего указан класс-родитель.
тогда как в ините мне загрузить экземпляр со сториборда правильно?
0
 Аватар для zulkis
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
28.10.2014, 08:08
residentkms, загружайте не в ините. Его вообще удалите.
Objective-C
1
2
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"MapScreen"];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2014, 08:08
Помогаю со студенческими работами здесь

создание делегата через имя метода в строке
Нашёл как создать делегат с помощью анонимного метода или лямбда-оператора, но это как-то криво выглядит, т.к. приходится брать у искомого...

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

Переопределение метода
Добрый Вечер!!! Объясните Пожалуйста поподробнее, что обозначет: &quot;переопределение метода&quot; . Приведите Пожалуйста пример! Как связана...

Переопределение метода
Не могу переопределить в производном классе метод Change, чтобы изменялось еще и грузоподъемность. using System; using...

Переопределение метода __format__
Здравствуйте. Может ли кто-нибудь показать пример, или дать ссылку, на пример переопределение метода __format__, как он должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru