2016-06-24 1 views
0

Я хочу определить метод в классе A. Метод должен быть перезаписан для любого подкласса i̶n̶s̶t̶a̶n̶c̶eass класса A. Экземпляры подклассов будут храниться в NSArray. Я попытался использовать делегата. Но это не сработало. Я проверил несколько статей, опубликованных в Интернете, таких как How do I create delegates in Objective-C? и http://www.tutorialspoint.com/ios/ios_delegates.htm Но они, похоже, не то, что я могу использовать для достижения своей цели. Может ли кто-нибудь, кто знаком с этим, дать мне подсказку, пожалуйста?Как временно определить подкласс с переопределяющим методом в Objective-C?

Например,

создать базовый класс под названием BaseClass для UICollectionViewCell и внутри BaseClass существует ActionMethod. Нажмите другую ячейку коллекции приведет к другому действию. Поэтому я буду определять подкласс для каждой ячейки, унаследованной от BaseClass для реализации различных действий. Затем, как перезаписать ActionMethod для каждого подкласса?

+2

Сверх-доступный для записи? – dan

+0

@dan Извините за непонятное. Я имею в виду, что каждый экземпляр может определить способ в классе A. –

+0

Может ли каждый из этих экземпляров быть другим подклассом A? Если нет, то каково решение, какая реализация метода должна использоваться для каждого экземпляра? Вам действительно нужен более конкретный пример того, чего вы пытаетесь достичь, чтобы отвечать на этот вопрос? – dan

ответ

0

Делегат будет работать здесь. Другим вариантом является использование блока обратного вызова, например.

@interface Cell : NSObject 

@property (nonatomic, copy) void(^onAction)(); 

- (void)actionMethod; 

@end 

@implementation Cell 

- (void)actionMethod { 
    self.onAction(); 
} 

@end 

Используется как

Cell *cell1 = [[Cell alloc] init]; 
cell1.onAction = ^{ 
    NSLog(@"Action 1"); 
}; 

Cell *cell2 = [[Cell alloc] init]; 
cell2.onAction = ^{ 
    NSLog(@"Action 2"); 
}; 

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

0

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

+0

Как временно определить подкласс в файле .m? –

+0

Вы имеете в виду как анонимный внутренний класс в Java? Objective-C не имеет ничего подобного. Вы можете определить дополнительные классы в файле .m, объявив для них '@ interface' и' @ implementation's. Но вместо подклассификации вы можете рассмотреть возможность создания метода действий * block *, который может быть задан динамически для каждой ячейки, как описано [здесь] (http://goshdarnblocksyntax.com/). – NRitH

0

Как правило, вы определяете базовый класс, например Shape, который имеет набор методов, общих для всех фигур, таких как getEnclosingRectangle, getShapeArea и т. Д. Затем вы определяете отдельные подклассы фигур, такие как овал, многоугольник, прямоугольник и треугольник. Вы даже можете определить подклассы этих фигур, такие как круг, полученный из овала. Затем вы можете сохранить все ваши овалы, прямоугольники и треугольники (например) в NSArray и вызвать метод getArea для каждого из них. И каждый будет иметь свой особый метод getArea, определенный в своем классе.