覆盖Objective-C中的方法

时间:2012-09-05 03:15:18

标签: objective-c override getter

我正在尝试覆盖Objective-C中的getter。我有两个课程FirstSecond,如:

First.h

@interface First : MashapeResponse {
    NSString* message;
}

@property(readwrite, retain) NSString* message;

@end

First.m

#import "First.h"

@implementation First

@synthesize message;

@end

Second.h

#import "First.h"

@interface Second : First

-(NSString*) message;

@end

Second.m

#import "Second.h"

@implementation Second

-(NSString*) message {
    return [NSString stringWithFormat:@"%@%@", @"Message is ", message];
}

@end

我正在尝试执行以下代码,但似乎永远不会执行Second中重写的方法。

First* first = [[First alloc] init];
[first setMessage:@"hello"];
NSLog(@"%@", [first message]); // "hello" expected

Second* second = (Second*) first;
NSLog(@"%@", [second message]); // "Message is hello" expected, but it's still "hello"

3 个答案:

答案 0 :(得分:4)

您实际上是将First视为Second(这是一种不好的形式);但基础类型仍为First,这就是您看到原始message(来自First)的原因。 Alloc a Second,它应该按预期工作。

答案 1 :(得分:1)

问题不在于你如何覆盖,而在于如何分配:

Second* second = [[Second alloc] init];
second.message = @"Hello";
NSLog(@"%@", [second message]);

当您将First*投射到Second*时,对象仍然保持原样 - First的实例。您需要分配Second的实例才能看到覆盖工作。

答案 2 :(得分:1)

在Objective-C中,强制转换只向编译器声明一个对象属于某种类型。它们无论如何都无法改变实际物体。在将first向下转换为指向Second实例的指针时,您已向编译器断言实际上是不正确的 - 因为first和{{现在指向的对象1}}仍然是second的一个实例。希望这有帮助!