9

分数を表す Objective-C クラスを作成していて、不変バージョンと可変バージョンを作成したいとします。

fractionByAddingFraction:Foundation フレームワークのパターンに従うと、不変バージョンと可変バージョンのメソッドが表示されることが予想される場合がありますaddFraction:

私が直面しているパラドックスは、2 つのクラス間で分数加算ロジックを 1 回だけ含める方法です。コードの重複を避けるために、不変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 のコレクションの主要な実装はごまかしています。 のサブクラスである実装が 1 つしかなくNSMutableFoo、プライベート可変フラグがあります。これは、クライアント コードが特定のオブジェクトが変更可能かどうかをテストできないことを意味しますが、おそらくデバッグとアサーションを除いて、それは決して良い考えではありません。

于 2012-05-10T06:12:32.427 に答える