1

我正在尝试覆盖 Objective-C 中的吸气剂。我有两个班级,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"
4

3 回答 3

4

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

于 2012-09-05T03:19:13.247 回答
1

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

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

当您强制First*转换为 时Second*,该对象仍然是它原来的样子 - 的一个实例First。您需要分配一个实例Second才能看到您的覆盖工作。

于 2012-09-05T03:19:59.647 回答
1

在 Objective-C 中,强制转换只会向编译器声明一个对象属于某种类型。他们不会以任何方式改变实际对象。在向下转换first为指向Second实例的指针时,您向编译器做出了实际上不正确的断言 - 因为现在两者都指向的对象first仍然secondFirst. 希望这可以帮助!

于 2012-09-05T03:21:43.713 回答