制作objective-c类的不可变和可变版本的最有效方法是什么?

时间:2012-05-10 02:12:56

标签: objective-c cocoa immutability mutable

假设我正在创建一个表示分数的Objective-C类,并且想要创建不可变和可变的版本。

遵循Foundation框架中的模式,您可能希望在不可变版本中看到方法fractionByAddingFraction:,在可变版本中看到addFraction:

我遇到的悖论是如何在两个类之间只包含一次分数加法逻辑。似乎不可变fractionByAddingFraction:方法需要了解(并利用)可变addFraction:方法以避免代码重复,并且在可执行类的实现中包含可变方法可以想象,他们可以被称为不可改变的对象,这就失败了。

非常感谢一个简短的解释(或者更好的是,这个简化示例的延续)!

2 个答案:

答案 0 :(得分:3)

你的方法是正确的(如果你真的需要一个可变的子类,你应该避免它,除非你真的需要它)。我不太清楚混淆的来源。你最容易使用addFraction:来实现fractionByAddingFraction:。这将是一个有点低效,但这是最有意义的方向。类似的东西:

- (void)addFraction:(Fraction *)anotherFraction {
   Fraction *newFraction = [self fractionByAddingFraction:anotherFraction];
   self.internalStuff = newFraction.internalStuff;
}

但通常你可能会使用两个类都使用的私有_GetInternalStuffByAddingInternalStuffs()函数来更有效地处理它。

答案 1 :(得分:0)

Foundation的集合的主要实现作弊:只有一个实现,它是NSMutableFoo的子类,它有一个私有的可变性标志。这意味着客户端代码无法测试特定对象是否可变,但除了调试和断言之外,这绝不是一个好主意。