假设我正在创建一个表示分数的Objective-C类,并且想要创建不可变和可变的版本。
遵循Foundation框架中的模式,您可能希望在不可变版本中看到方法fractionByAddingFraction:
,在可变版本中看到addFraction:
。
我遇到的悖论是如何在两个类之间只包含一次分数加法逻辑。似乎不可变fractionByAddingFraction:
方法需要了解(并利用)可变addFraction:
方法以避免代码重复,并且在可执行类的实现中包含可变方法可以想象,他们可以被称为不可改变的对象,这就失败了。
非常感谢一个简短的解释(或者更好的是,这个简化示例的延续)!
答案 0 :(得分:3)
你的方法是正确的(如果你真的需要一个可变的子类,你应该避免它,除非你真的需要它)。我不太清楚混淆的来源。你最容易使用addFraction:
来实现fractionByAddingFraction:
。这将是一个有点低效,但这是最有意义的方向。类似的东西:
- (void)addFraction:(Fraction *)anotherFraction {
Fraction *newFraction = [self fractionByAddingFraction:anotherFraction];
self.internalStuff = newFraction.internalStuff;
}
但通常你可能会使用两个类都使用的私有_GetInternalStuffByAddingInternalStuffs()
函数来更有效地处理它。
答案 1 :(得分:0)
Foundation的集合的主要实现作弊:只有一个实现,它是NSMutableFoo
的子类,它有一个私有的可变性标志。这意味着客户端代码无法测试特定对象是否可变,但除了调试和断言之外,这绝不是一个好主意。