2

因此,我正在阅读 Apple 的 Objective-C 文档(在进入 iphone 开发之前)。其中一个练习表明我应该创建一个指定的初始化程序(带有 3 个参数)和合适的工厂方法。

现在我根据我的理解做了这个,但我无法实现工厂方法,因为我不知道我是否应该在其实现中使用 alloc 和 init ?

练习:

声明并实现一个新的指定初始化程序,用于使用指定的名字、姓氏和出生日期以及合适的类工厂方法创建 XYZPerson。不要忘记重写 init 以调用指定的初始化程序。

编码:

//.h 

-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob;

//.m
-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *)dob{
    self = [super init];
    return [self initWithNameAndDob:fName last:lName birth:dob];
}

实施中缺少什么?

谢谢你,

4

2 回答 2

16

声明并实现一个新的指定初始化器,用于使用指定的名字、姓氏和出生日期创建 XYZPerson...

您在声明中是正确的,但您的实现是递归的,因为它正在调用自己。做类似的事情

//.h
-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob;
//.m
-(id)initWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *)dob{
    if(self = [super init]) {
        // use the parameters to do something, eg.
        _fName = fName; // assuming you have an ivar called _fName 
        _lName = lName; // assuming you have an ivar called _lName
        _dob = dob; // assuming you have an ivar called _dob
    }
    return self;
}

然后

...以及合适的类工厂方法。

工厂方法是一种产生对象实例的类方法。最常见的实现是让它分配和初始化对象的新实例并返回它。

//.h
+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {


//.m
+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {
return [[XYZPerson alloc] initWithNameAndDob:fName last:lName birth:dob];
}

最后

不要忘记重写 init 以调用指定的初始化程序。

由于您设计的初始化程序是initWithNameAndDob:last:birth:您的init实现必须调用它。设计的初始化器的参数必须是合理的默认值,在这种情况下nil很好。

-(id)init {
     return [self initWithNameAndDob:nil last:nil birth:nil];
 }

最后,我想指出您对初始化程序的命名约定并不是那么好。一个更合适和可读的将是

-(id)initWithFirstName:(NSString *)fName lastName:(NSString *)lName dateOfBirth:(NSDate *) dob;
于 2012-12-30T16:21:30.770 回答
5

Gabriele Petronella 的出色解释,但存在问题。

+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {
return [[XYZPerson alloc] initWithNameAndDob:fName last:lName birth:dob];
}

It should be replaced with 
+(instancetype)personWithNameAndDob:(NSString *)fName last:(NSString *)lName birth:(NSDate *) dob {
return [[self alloc] initWithNameAndDob:fName last:lName birth:dob];
}

规则: 不要用名字来引用你自己的类,因为你不知道具体的类是什么。您会无意中切断通过子类化扩展和覆盖类的能力。相反,要在类的工厂方法中分配实例:[self alloc] 参考:http: //qualitycoding.org/factory-method/

于 2014-12-04T08:07:20.130 回答