0

PersonクラスとPersonChildクラスの例を実行しています。なぜこのIntをPersonクラスから取得できるのか疑問に思いました。

//主要

#import <Foundation/Foundation.h>
#import "Person.h"
#import "PersonChild.h"

int main(int argc, const char * argv[]){
    @autoreleasepool {
        PersonChild *Ben = [[PersonChild alloc]init];
        Ben.age = 25;  <-- Property 'age' not found on object of type 'PersonChild *'
        [Ben printThing];
    }
    return 0;
}

//個人クラス

#import "Person.h"

@implementation Person
@synthesize age, weight;

@end

//Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject{
    int age;
}
@property int age, weight;
@end

//PersonChildクラス

#import "PersonChild.h"

@implementation PersonChild

-(void) printThing{
   NSLog(@"%i", age);
}
@end

//PersonChild.h

#import <Foundation/Foundation.h>
#import "Person.h"

@class Person;
@interface PersonChild : NSObject

-(void) printThing;

@end
4

2 に答える 2

3

PersonChildはPersonから継承していません。PersonChild.hの正しい構文は次のとおりです。

#import "Person.h"
@interface PersonChild : Person
于 2013-02-23T20:30:37.377 に答える
0

ヘッダーを誤ってリストしていない限り、「age」はperson.hのプロパティであり、「Ben」はpersonChild.hのインスタンスです。

クラスのインスタンスで使用されるインスタンス変数(iVar)は、そのクラス(またはスーパークラス)でインスタンス変数として宣言する必要があります。

継承とインポートを混同していると思います。上記で行っているのは、Person.hをPersonChild.hにインポートし、これによりすべての「Person」クラスiVarが「PersonChild」クラスで使用可能になると想定しています。

違いを理解する1つの方法は、PersonChild.hを次のように変更することです。@interface行にPersonを追加することが、PersonChildクラスがPersonクラスから継承していると言う正しい方法であることに注意してください。これでバグが修正されるはずです。

#import <Foundation/Foundation.h>
#import Person.h    

@interface PersonChild : Person

-(void) printThing;
@end

お役に立てれば

于 2013-02-23T20:18:25.837 に答える