我有面向对象编程的经验,但出于某种原因这种情况并不熟悉.请考虑以下
Objective-c 2.0代码:
- @interface A : NSObject
- @end
- @implementation A
- - (void) f {
- [self g];
- }
- @end
- @interface B : A
- @end
- @implementation B
- - (void) g {
- NSLog(@"called g...");
- }
- @end
这是从父类中的方法调用子类的方法的正确方法吗?如果另一个子类没有实现方法g会发生什么?也许有更好的方法来解决这个问题,就像父类A中的抽象方法一样?
解决方法
关键是在父类中有一个可以在子类中重写的方法.
- @interface Dog : NSObject
- - (void) bark;
- @end
- @implementation Dog
- - (void) bark {
- NSLog(@"Ruff!");
- }
- @end
- @interface Chihuahua : Dog
- @end
- @implementation Chihuahua
- - (void) bark {
- NSLog(@"Yipe! Yipe! Yipe!");
- }
- @end
您会看到,您的子类将使用自己的实现覆盖父方法.您可能会看到它像这样使用:
- Dog *someDog = [Chihuahua alloc] init] autorelease];
- [someDog bark];
输出:Yipe!沮丧的声音!沮丧的声音!