Objective-Cで、サブクラスだけで使用出来るプロパティを作成する

このエントリーをはてなブックマークに追加
はてなブックマーク - Objective-Cで、サブクラスだけで使用出来るプロパティを作成する

Objective-Cでクラスを作る場合は、他のクラスからアクセスさせたくないプロパティはクラスエクステンションにして、自クラスだけでアクセス出来るようにします。こんな感じです。

PCEBaseClass.h
PCEBaseClass.h

モジュールはこんな感じです。
PCEBaseClass.m
PCEBaseClass.m

こうすることによって、notesというプロパティは、参照するクラスからは変更されたくないので、ヘッダーにはreadonly,クラスエクステンションでは、readwriteで定義することによって、クラス内で変更可能です。
booksというプロパティは、クラス内ではNSMutableArrayとして振る舞いたいけれども、対外的には変更してほしくないので、NSArrayとして返しています。booksと別のbooksInternalという内部用プロパティをNSMutableArrayで定義して、内部ではbooksInternalにアクセスすることによって、オブジェクトの追加が出来るようにしています。

このクラスを継承したクラスを作った場合は、対外的には同じくbooks, notesを触られたくないですが、継承したクラス内では触りたい訳です。

PCEExtendedClass.h
PCEExtendedClass.h

モジュールでbooks, notesを触ろうとすると当然ですが、エラーになります。
PCEExtendedClass.m
PCEExtendedClass.m

これを解決するために、クラスエクステンションを別ファイルに出してあげると解決出来ました。
Class Extentionを作成
Class Extentionを作成

このようにします。
クラスエクステンション作成2
クラスエクステンション作成2

クラスエクステンションの新しいファイルに、プロパティを記述
クラスエクステンションの内容
クラスエクステンションの内容

ベースクラスでは、クラスエクステンションをモジュールでImportします。

ベースクラス
ベースクラス

継承したクラスでもクラスエクステンションをモジュールでImportします。booksに関しては、内部的にmutableのプロパティ booksInteranlをクラスエクステンションで定義しているのでそちらを使用します。

継承したクラス
継承したクラス

これで、他のクラスからはprivateExtentionのヘッダーをインポートしないようにすれば定義が見えないので、コンパイル時点で正しい処理が行われていることを確認出来ます。

Comments

comments

Powered by Facebook Comments

Post a comment

You may use the following HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">