我正在尝试创建类Dog
的实例,但编译器无法识别该类,也不会实例化它。我尝试将初始化程序从超级类Pet
复制到Dog
,但这并没有使它工作。为什么我不能实例化Dog
对象?
Pet.h
#import <Foundation/Foundation.h>
@interface Pet : NSObject
{
// Some ivars
}
//Randomizer
+(id)randomPet;
//Initializer
-(id)initName:(NSString *)name
initColor:(NSString *)color
initBreed:(NSString *)breed;
// Getters and setters...
@end
Pet.m
#import "Pet.h"
@implementation Pet
+(id)randomPet
{
// Empty
}
-(id)initName:(NSString *)name
initColor:(NSString *)color
initBreed:(NSString *)breed;
{
self = [super init];
if(self)
{
// Initialization...
}
return self;
}
@end
Dog.h
#import "Pet.h"
@interface Dog : Pet
-(id)initName:(NSString *)name initColor:(NSString *)color
initBreed:(NSString *)breed;
// Getters and setters...
@end
Dog.m
#import "Dog.h"
@implementation Dog
+(id)RandomPet
{
// Snip...
}
- (id)initName:(NSString *)name
initColor:(NSString *)color
initBreed:(NSString *)breed;
{
self = [super init];
if(self) {
// Initialization...
}
return self;
}
的main.m
#import <Foundation/Foundation.h>
#import "Pet.h"
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Dog *d = [[Dog alloc] init]];
}
return 0;
}
答案 0 :(得分:1)
您不是将Dog导入到具有main方法的方法中。添加:
#import "Dog.h"
根据宠物进口。您可能需要考虑将所有域对象放在一个标题中。
答案 1 :(得分:1)
我注意到的一些事情:
您的main.m
需要导入Dog.h
,而不仅仅是Pet.h
,因为它专门针对Dog
类。
Dog.h
中的界面重新声明了一系列已在父类中声明的方法。您不需要这样做 - 所有类都隐式支持在父类上定义的所有方法。您决定是否需要独特的实现,但不需要在标题中说明。
-[Dog init]
和-[Pet init]
均未实施。也许你想要(不完全实现的)+[Dog randomPet]
方法?
答案 2 :(得分:0)
您有以下错误:
而不是#import Pet.h
使用#import Dog.h
Dog *d = [[Dog alloc] init]];
应为Dog *d=[Dog alloc]init];
无需在子类中重新定义与超类中相同的方法。
除了这些答案,我想补充一些东西,这些都不是错误,但它会增加你的可可编程风格和习惯:
方法
//Initializer
-(id)initName:(NSString *)name
initColor:(NSString *)color
initBreed:(NSString *)breed;
不符合标准,应该是:
//Initializer
-(id)initName:(NSString *)name withColor:(NSString *)color withBreed:(NSString *)breed;
以下几行
int petId;
while(petId != 1 && petId!=2)
用petID=0;
初始化怎么样?如果它的垃圾值变为1,那么它将永远不会进入循环。
您可以使用@property创建属性。