2012-06-03 82 views
0

我有点(实际上,很多)困惑,为什么我在下面执行下面的代码时收到底部列出的输出。昆虫和哺乳动物实例应该是两个独立的实例变量对象。两个对[super initAttributes]的调用都应该独立初始化每个实例,每个实例都通过self。那么为什么昆虫哺乳动物实例在显示时具有相同的值?看起来好像两个实例都指向内存中的同一个对象。Objective-C子类化:两个子类实例似乎指向相同的实例

任何帮助将非常感激。谢谢!

动物

//Interface 

#import <Foundation/Foundation.h> 

@interface Animal : NSObject 

-(id) initAttributes: (NSString *) initName Legs: (int) initLegs Arms: (int) initArms; 
-(void) display; 

@end 

//Implementation 

#import "Animal.h" 

@implementation Animal 

NSString *name; 
int legs, arms; 

-(id) initAttributes: (NSString *) initName Legs: (int) initLegs Arms: (int) initArms 
{ 
    self = [super init]; 

    if (self) 
    { 
     name = initName; 
     legs = initLegs; 
     arms = initArms; 
    } 

    return self; 
} 

-(void) display 
{ 
    NSLog(@"Name: %@ Legs: %i Arms: %i", name, legs, arms); 
} 

@end 

昆虫类

//Interface 

#import "Animal.h" 

@interface Insect : Animal 

-(id) initInsect: (NSString *) initName; 

@end 

//Implementation 

#import "Insect.h" 

@implementation Insect 

-(id) initInsect: (NSString *) initName 
{ 
    self = [super initAttributes: initName Legs: 8 Arms: 0]; 

    if (self) 
    { 
    } 

    return self; 
} 

@end 

哺乳动物类

//Interface 

#import "Animal.h" 

@interface Mammal : Animal 

-(id) initMammal: (NSString *) initName; 

@end 

//Implementation 


#import "Mammal.h" 

@implementation Mammal 

-(id) initMammal: (NSString *) initName 
{ 
    self = [super initAttributes: initName Legs: 2 Arms: 2]; 

    if (self) 
    { 
    } 

    return self; 
} 

@end 

主要

#import <Foundation/Foundation.h> 
#import "Insect.h" 
#import "Mammal.h" 

int main (int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     Insect *insect = [[Insect alloc] initInsect: @"Spydor"]; 
     Mammal *mammal = [[Mammal alloc] initMammal: @"Platypus"]; 

     [insect display]; 
     [mammal display]; 
    } 

    return 0; 
} 

输出

名称:鸭嘴兽腿:2种武器:2
名称:鸭嘴兽腿:2种武器:2

+0

昆虫有6条腿吗? – ThomasW

+0

这是我的班级,他们有8条腿。 :-) – user1433587

回答

1

我会认为这是家庭作业,所以这里是一个提示: 错误与您的变量声明。不要为全局变量使用全局变量。

+0

对于学习语言的人来说,这可能是一个非常微妙的问题。 – ThomasW

+0

@ user1433587 [Start here](https://developer.apple.com/library/mac/documentation/cocoa/conceptual/objectivec/Chapters/ocDefiningClasses.html#//apple_ref/doc/uid/TP30001163-CH12-SW1) 。具体来说,请阅读_Class implementation_部分,并且不要错过_Class Interface_部分中的注释。 – albertamg

+0

感谢您的回复!我正在理解的风口浪尖上。不是作业;只是试图学习Objective-C。我将在Apple Developer网站上查看更多的信息。 – user1433587