我有一组类来表示从数据库加载的一些对象。这些对象有几个变体,所以我有一个公共基类和两个子类来表示它们的区别。它们共同的关键字段之一是id字段。
不幸的是,对象的id不是在所有变体中都是唯一的,而是在单个变体中。我的意思是,一个a类型的对象可以有一个介于,比如说,0到1000000之间的id。一个B类型的对象可以有一个介于,25000到1025000之间的id。这意味着id号有一些重叠。不过,这些对象只是同类事物的变体,所以我想在代码中这样看待它们(由于遗留的原因,他们被分配了来自不同集合的ID。)
@class BaseClass
@class TypeAClass : BaseClass
@class TypeBClass : BaseClass
基类有一个方法(NSNumber*)objectId。然而,TypeA和TypeB的实例可能有重叠的id,正如上面所讨论的,所以当涉及到相等性并将它们放入集合时,我不能仅仅使用id来检查它。
-(NSUInteger)hash
{
return (NSUInteger)[self class] ^ [self.objectId hash];
}
我也这样实现了isEqual:
- (BOOL)isEqual:(id)object
{
return (self == object) || ([object class] == [self class] && [self.objectId isEqual:[object objectId]]);
}
这似乎是可行的,但我想我在这里只是想确保我没有忽略某些东西-特别是通过以这种方式使用类指针生成哈希。这是安全的还是有更好的方法?