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

use*_*983 9 cocoa objective-c mutable immutability

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

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

我遇到的悖论是如何在两个类之间只包含一次分数加法逻辑.似乎不可变fractionByAddingFraction:方法需要知道(并利用)可变addFraction:方法以避免代码重复,并且在可执行类的实现中包含可变方法意味着可以想象它们可以在不可变对象上调用,这打败了这一点.

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

Rob*_*ier 3

你的方法是正确的(如果你真的需要一个可变的子类,你应该避免它,除非你确实需要它)。我不太清楚混乱来自哪里。您最容易addFraction:使用来实现fractionByAddingFraction:。这会有点低效,但这是最有意义的方向。就像是:

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

但通常情况下,您可能会_GetInternalStuffByAddingInternalStuffs()使用两个类都会使用的一些私有函数来更有效地处理这个问题。