2012-04-18 15 views
1

GNUStepのNSNumberの実装のソースコードを調べて、ファクトリメソッドの実装がどのように機能するのかを理解しました。NSNumberとNSTemporaryNumberはなぜ2つの異なるクラスとして扱われますか?

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

また、NSNumberオブジェクトの作成を避け、NSTemporaryNumberのオブジェクトを作成する場合は、特定のタイプのオブジェクトを作成するためにallocWithZoneをオーバーライドしました。

私が理解できなかったのは、NSNumber自体で同じことをすることはできないのですか? なぜ空白の実装を与えても、特定の型のオブジェクトを作成してから、自己解放します。

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

私は2つのmediaItems、ビデオ、オーディオ、写真などを持っている私のプロジェクトのための工場実装を実装する必要がある場合 私は別のクラスとそれに対応するオブジェクトを作成するinitWithMediaTypeに渡すenumを持っています。正しい子クラスを返し、それを返して破壊します。

NSNumberとNSTemporaryNumberのような2つのクラスがあります:メディアとTemporaryMedia、空の実装が上記の実装とは別のもの?

このような操作をしてください。 これは、Objective CでFactoryパターンを実装する必要がありますか?

私の質問はばかばかしいかもしれない私はJava、C++の背景から見えます。 目的は同じかもしれませんが、抽象クラスがないためObjective Cのやり方を理解するのが難しいと感じています。ソースへ

リンク: http://www.koders.com/objectivec/fid46956186C20201706AFE1744AA7AFEEE09D1FE5A.aspx

答えて

1

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

allocを呼び出すと、作成するオブジェクトの種類がわからないため、中立型が作成されて代わりに返されます。これは、適切なinitを受け取ったときに適切に置き換えられます。

このパターンは、クラスクラスタの実装用です。それ自身のインスタンスだけを提供するクラスを作成する場合は無視することができます。

+0

ありがとうございます。 しかし私はまだ私の心の中で疑いが1つあった。 NSNumberの適切なinitメソッドは、適切なクラスのオブジェクトを作成し、NSTemporaryNumberを最初に作成して同じことを行うよりもNSNumberインスタンスを破棄しますか? また.. 私たちはまた、いくつかの「作成」メソッドを持っています。抽象ファクトリパターンを実装していますか? このようなメソッドが利用できるようになるとクラスクラスターが必要になりますか? –

関連する問題