我正在尝试覆盖Objective-C中的getter。我有两个课程First
和Second
,如:
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"
答案 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
的一个实例。希望这有帮助!