如何在Objective-C中使用重写方法临时定义子类?

时间:2016-06-24 15:11:46

标签: ios objective-c inheritance

我想在类A中定义一个方法。对于类A的任何i̶n̶s̶t̶a̶n̶c̶e̶子类,该方法应该是可写的。子类的实例将存储在NSArray中。我试图使用委托。但它没有用。我检查了一些在线发布的文章,例如How do I create delegates in Objective-C?http://www.tutorialspoint.com/ios/ios_delegates.htm但是它们似乎不是我可以用来实现我的目标。任何熟悉这个的人都可以给我一个提示吗?

例如,

我为 UICollectionViewCell 创建一个名为 BaseClass 的基类,在BaseClass中有一个 ActionMethod 。单击不同的集合单元格将导致不同的操作。因此,我将为从 BaseClass 继承的每个单元格定义子类,以实现不同的操作。那么如何为每个子类覆盖ActionMethod?

3 个答案:

答案 0 :(得分:0)

您的意思是覆盖,而非覆盖方法。在Objective-C中,除了在子类中使用完全相同的方法签名进行实现之外,您不必执行任何操作。

答案 1 :(得分:0)

通常,您定义一个基类,例如Shape,它具有一组对所有形状都通用的方法,例如getEnclosingRectangle,getShapeArea等。然后定义单独的形状子类,例如椭圆形,多边形,矩形和三角形。您甚至可以定义这些形状的子类,例如从椭圆形派生的圆。然后,您可以将所有椭圆,矩形和三角形(例如)存储在NSArray中,并为每个椭圆调用getArea方法。每个人都会在他们的班级中定义他们特定的getArea方法。

答案 2 :(得分: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");
};

如您所见,您不需要子类,您只需动态地将该代码添加到每个单元格。