重载和重写是面向对象编程中非常重要的概念,也是 Objective-C 语言中的常见机制。下文将详细介绍 Objective-C 中的重载和重写。
重载
重载是指在同一个类中,可以有多个同名方法,但是参数的类型和个数必须不同。当调用该方法时,编译器会根据参数个数和类型,自动匹配调用对应的方法。
下面是一个简单的示例:
@interface Calculator : NSObject
- (int)add:(int)a to:(int)b;
- (int)add:(int)a to:(int)b with:(int)c;
@end
@implementation Calculator
- (int)add:(int)a to:(int)b {
return a + b;
}
- (int)add:(int)a to:(int)b with:(int)c {
return a + b + c;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Calculator *c = [[Calculator alloc] init];
int sum1 = [c add:1 to:2];
int sum2 = [c add:1 to:2 with:3];
NSLog(@"sum1 = %d, sum2 = %d", sum1, sum2);
}
return 0;
}
在上述示例中,我们在 Calculator 类中重载了 add:to: 方法,在第一个方法中只有两个参数,而在第二个方法中有三个参数。当我们在 main 函数中调用 add:to: 方法时,会根据传入的参数个数和类型自动匹配调用对应的方法。
重写
重写是指子类对父类中已有的方法进行重新定义。子类需要重新写一个和父类方法名、参数类型、返回值类型都相同的方法。当子类对象调用该方法时,会执行子类中的方法而不是父类中的方法。
下面是一个重写的示例:
@interface Shape : NSObject
- (double)area;
@end
@implementation Shape
- (double)area {
return 0;
}
@end
@interface Circle : Shape
@property(nonatomic) double radius;
@end
@implementation Circle
- (double)area {
return M_PI * _radius * _radius;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Circle *c = [[Circle alloc] init];
c.radius = 5.0;
NSLog(@"The area of the circle is %.2f", [c area]);
}
return 0;
}
在上述示例中,我们定义了一个 Shape 类,其中有一个计算面积的方法 area。然后我们创建了一个 Circle 类,继承自 Shape 类,并重写了 area 方法。当我们调用 Circle 对象的 area 方法时,会执行 Circle 中的方法而不是 Shape 中的方法。
以上就是 Objective-C 中的重载和重写的详细讲解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Objective-C中的重载和重写详解 - Python技术站