1

Objective-C でゲッターをオーバーライドしようとしています。私は2つのクラスを持っています、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 を aFirstとしてキャストしていますSecond(これは悪い形式です)。ただし、基になる型はまだFirstです。そのため、元のmessage(からFirst) が表示されます。aSecondを割り当てると、期待どおりに動作するはずです。

于 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、実際には正しくないアサーションをコンパイラーに行いました。これは、オブジェクトが現在両方によって指されておりfirstsecondまだ のインスタンスであるためFirstです。お役に立てれば!

于 2012-09-05T03:21:43.713 に答える