1

GNUStep の NSNumber の実装のソース コードを調べて、ファクトリ メソッドの実装がそこでどのように機能するかを理解しました。

そこから私が理解できたのは、すべての initWithXYZ 種類のメソッドに対して空白の実装を持つ NSNumber があることです。NSTemporaryNumber は、特定の型のオブジェクトを実際に作成し、それ自体を自動解放し、作成されたオブジェクトを返すすべての initWithXYZ メソッドを実装した階層内の中間クラスのように機能していました。

また、allocWithZone は、NSNumber オブジェクトの作成を回避し、そうでない場合は特定のタイプのオブジェクトを作成する場合は NSTemporaryNumber のオブジェクトを作成するためにオーバーライドされました。

私が理解できなかったのは、NSNumber自体で同じことを行うことはできないのですか? なぜまったく空の実装を提供し、特定のタイプのオブジェクトを作成してから、自己を自動解放します。

また、NSNumber 自体に createXYZ メソッドの実装がある場合、なぜ initWithXYZ メソッドがあるのでしょうか?

プロジェクトのファクトリ実装を実装する必要がある場合、たとえば video 、 audio 、 photo などの 2 つの mediaItems があるとします。そのために別のクラスと、正しい子クラスのオブジェクトを作成する initWithMediaType に渡す対応する列挙型があります。それとそれ自体を破壊します。

NSNumber と NSTemporaryNumber のような 2 つのクラスがあります: Media と TemporaryMedia と言って、1 つは空白の実装を持ち、もう 1 つは上記の実装を持ちますか?

私はこのようなことをすべきですか?これは、Objective C で Factory パターンを実装する方法ですか?

私の質問はばかげているように思えるかもしれませんが、私は物事が異なって見えるJava、C++のバックグラウンドから来ました。目的は同じかもしれませんが、Objective C には抽象クラスがないため、その方法を理解するのが難しいと感じています。

ソースへのリンク: http://www.koders.com/objectivec/fid46956186C20201706AFE1744AA7AFEEE09D1FE5A.aspx

4

1 に答える 1

1

ポイントは、それNSNumberがクラス クラスタであるということです。実際に最終的に得られるクラスは、NSIntNumber、 、NSFloatNumberまたは他のいくつかのクラスの 1 つになる可能性があります。それらはすべて同じメッセージに応答しますNSNumber(そして、通常、このパターンではそのサブクラスになりますが、それは必須ではありません) ので、呼び出し元に実際の違いはありません。

呼び出すとalloc、作成するオブジェクトの種類を知る方法がないため、代わりにニュートラル タイプが作成されて返されます。適切な を受け取ると、適切に置き換えますinit

したがって、このパターンはクラス クラスターの実装用です。それ自体のインスタンスのみを提供するクラスを作成する場合は、無視できます。

于 2012-04-18T14:50:22.103 に答える