カスタマイズされた型のバージョンを作成できるかは、その型自身の実装方法に依存します。型がカスタマイズに対応していない場合、その型へのcustomizeBegin:メッセージはエラーになります。@protocol宣言に定義された型はすべて、新しい型オブジェクトを作成する少なくとも1サイクルのカスタマイズをサポートするものと考えることができます。すでにカスタマイズされた(customizeEndが返した)型オブジェクトが、それ以上のサイクルのカスタマイズ(もう1組のcustomizeBegin:/customizeEndシーケンスによる)をサポートするか否かは、最初に継承を始めたオリジナルの型の実装方法に依存します。明示的に記述しているのでなければ、型が複数サイクルのカスタマイズをサポートすると考えてはいけません。
型オブジェクトのカスタマイズで、オリジナルの型オブジェクトが変更されることはありません。その代わりに、カスタマイズ機能が組み込まれた新しい型オブジェクトを作成します。新しい型オブジェクトのcreate:メッセージは、createBegin:とcreateEndを使って作成時と同じメッセージシーケンスが元の型オブジェクトに送られたかのように、新しいインスタンスを作成します。型のカスタマイズは、新しいインスタンスを作成するcreateBegin:とcreateEndメッセージを使って作成時のメッセージシーケンスをくくることでなされるのではありません。createBeginとcreateEndメッセージを使用します。
型によっては、新しいインスタンスを作成する時だけではなく、その型自身の新しいバージョンをカスタマイズするためにも作成時のメッセージが利用できます。カスタマイズされる型から作成されるオブジェクトは、そのカスタマイズされる型に送られた作成時メッセージがあらかじめセットされたオプションを持つことになります。同じ作成時オプションを必要とするオブジェクトが多くあるときは、カスタマイズされる型のバージョンを作っておき、その型からさらなるインスタンスを作成するという方法が通常は簡単でしかも迅速です。
Example defobj/Customize/-customizeCopy:/1.
newArrayType1 = [Array customizeBegin: aZone]; [newArrayType1 setCount: 100]; newArrayType2 = [newArrayType2 customizeCopy: aZone]; [newArrayType2 setDefaultMember: UnsetMember]; newArrayType1 = [newArrayType1 customizeEnd]; newArrayType2 = [newArrayType2 customizeEnd]; array1 = [newArrayType1 create: aZone]; // DefaultMemberオプションなし array2 = [newArrayType create: aZone]; // DefaultMemberオプションセット |