【发布时间】:2013-03-10 08:08:44
【问题描述】:
为了帮助学习目标 c/oop,我正在设计一个 iOS 应用程序来存储定期体重测量值。我希望能够以各种单位(Kg、Lb 等)检索体重。对于每个体重实例,我可以/应该使用自定义 getter 将 NSNumber 子类化,以正确单位返回重量吗?也许我应该简单地将 NSObject 子类化?
【问题讨论】:
标签: objective-c oop object
为了帮助学习目标 c/oop,我正在设计一个 iOS 应用程序来存储定期体重测量值。我希望能够以各种单位(Kg、Lb 等)检索体重。对于每个体重实例,我可以/应该使用自定义 getter 将 NSNumber 子类化,以正确单位返回重量吗?也许我应该简单地将 NSObject 子类化?
【问题讨论】:
标签: objective-c oop object
我可以/应该使用自定义 getter 子类化 NSNumber 吗?它以正确的单位返回重量?也许我应该简单地将 NSObject 子类化?
你可以吗?是的。你应该?不。NSNumber 实例实际上永远不是 NSNumber。 NSNumber 充当它的各种子类的分配器,这意味着当您对它进行子类化时,您基本上承诺重新实现 NSNumber 的类分配方面(NSArray 和 NSString 也是如此)。
尝试在 NSNumber 上编写一个类别,而不是尝试对其进行子类化,即使这样,NSNumber 也从未设计用于操作和数学运算。数字本质上是不可变的构造,因此最好编写一个方法,在控制器对象中的某处使用原语计算事物。在您的特定情况下,NSNumber 仅适用于持久性。
【讨论】:
不,根本不要使用NSNumber,甚至不要给它添加一个类别——这个类(集群)如果设计用于当你需要将原始类型存储为对象而不是其他的时候。
如果您希望封装一个权重,请编写一个类来执行此操作,类似于(在终端键入的代码):
@interface Weight : NSObject
@property double kilos:
@property double pounds;
// etc
@end
@implementation Weight
{
double value; // stored in a suitable unit, kg, lb, oz, g, etc.
}
// implement getters and setters converting between unit of property and unit of value
// implement dependent property methods to setting, say, pounds produces a KVO
// notification for both pounds and kilos, etc. E.g.:
+ (NSSet *) keyPathsForValuesAffectingPounds
{
return [NSSet setWithObject:@"kilos"];
}
@end
现在您可以将值设置为一个单位,将其读取为另一个单位,并在设置了一个单位时获取所有属性的 KVO 通知。
您需要添加构造函数(例如newWeightWithKilos:),也许是操作(例如addWeight: - 它可以只添加内部值),并且需要确定Weight 是可变的还是不可变的。
【讨论】:
你不需要继承 NSNumber 而是你可以继承 NSObject 并添加一个属性来设置基本单位的重量(例如:kg's),然后你可以添加几个以基本单位为单位的重量并返回转换器值的方法以您指定的单位(磅等)。
【讨论】: