我正在学习Objective-C,作为课程之一,我们创建了一个类Employee,它的超类Person,以及一个Asset类,其实例由Employee拥有。为了测试类及其实例函数,我编写了以下代码
int main(int argc, const char *argv[]){
@autoreleasepool{
NSMutableArray *employees = [[NSMutableArray alloc] init];
for (int i = 0; i < 10; i++){
Employee *person = [[Employee alloc]init];
[person setWeightInKilos:90 + i];
[person setHeightInMeters:1.8 - i/10.00];
[person setEmployeeID:i];
[employees addObject:person];
}
.../*code continues from here, to assign [person]
's at random indexes in *employees, instances of the Asset class */
}
}
我想知道setting
[person]
使用一种方法有什么好处或坏处,后者又会调用其他方法,如下所示:
main.m:
....
for (int i = 0; i < 10; i++){
Employee *person = [[Employee alloc]init];
[person setWeightInKilos:90 + i withAHeightOf:1.8 - i/10.00 andId:i];
[employees addObject:person];
}
....
感谢。
答案 0 :(得分:0)
您的Person
课程有多个属性,包括weightInKilos
,heightInMeters
和employeeID
。
当然,您可以单独设置每个属性。为方便起见,您可以提供特殊的“帮助”方法,以便在一次调用中更轻松地设置多个属性。这是完全可选的。您是否选择添加这些额外的方法完全取决于个人品味和风格。
这种“帮助”方法的一个考虑因素是绘制线的位置。哪些属性应该是这些方法的参数?如果您以后添加另一个属性会怎样?您是否更新了“helper”方法以获取另一个参数,然后更新调用这些方法的所有代码?
在许多情况下,最好单独设置每一个。我用于决定是否创建这样的“帮助”方法的一个准则是,如果对象需要将某组属性设置为有效。如果存在这种情况,那么我通常会创建一个特殊的init
方法,该方法将所需的属性作为参数。然后可以单独设置所有可选项。
答案 1 :(得分:0)
您忽略了如何定义Employee
对象。 weight
,height
和identification
是否属性?如果是这样,它们通常会为它们自动生成存取方法,因此您不需要编写这些例程。属性具有很好的便利性。
至于为什么你会使用一种方法而不是另一种方法,最引人注目的原因是个人风格。需要考虑的事项 - 如果你选择改变一个人的存储重量会发生什么;你有一个方法只设置那个参数,还是你需要设置它们的所有内容?
有一个初始化程序可以接收有关某个对象的初始化信息,但像- (id)initWithWeight:andHeight:andId:andSomethingElse:andMoreStuff:
这样的东西比我把它拉出来的要快得多。要解决此问题,NSDictionary
类可能会有所帮助,其中字典包含您选择包含的所有字段,方法变为- (id)initUsingDictionary:(NSDictionary *)dictionary;
。一个很好的好处是你可以轻松地使字段可选,并且单个方法签名处理它。
答案 2 :(得分:0)
基本上这里没有任何对与错,objective-c语法和编码约定允许你有多个参数的长消息。
这里有几个选项:
initWithId: height: weight:
)要做出决定,首先应该问问自己:
大多数时候我选择让我的对象不可变,这意味着我为它们创建了一个只读属性,并通过init函数设置它们。