9

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

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

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

一个简短的解释(或者更好的是,这个简化示例的延续)将不胜感激!

4

2 回答 2

3

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

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

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

于 2012-05-10T02:22:51.830 回答
0

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

于 2012-05-10T06:12:32.427 回答