2010-12-12 10 views
0

カプセル化について少し混乱しています。一般的に(またはObj-Cで)、それはインタフェース/実装の分離を意味するのか、それともメソッドを介してイヴァールへのアクセスを暗示するのか?対物レンズのカプセル化

明確にしてください。ありがとうございました。

+6

9つの質問、受諾された回答、投票無し、Wikipediaを使用しているように見えないようです。どうしたの? – Abizern

答えて

6

実際には両方。

nacho4dによれば、クラス内にインスタンス変数をカプセル化し、メソッドやプロパティを使用してその値を読み書きすることで、直接アクセスすることを防ぐことができます。これにより、何かが値を読み書きしたときにインスタンスが常に知ることができ、直接ivarアクセス​​はC構造体の値を設定することと変わりません。

しかし、@interface@implementationから分離することも、カプセル化に大きく貢献します。そして、ここ数年の言語拡張の目標の1つは、その分離によって提供されるカプセル化の程度を高めることでした。

つまり、クラスのプライマリ@interfaceには、のみが含まれ、他の開発者/コードとやり取りする部分が含まれるようになりました。もしあれば、パブリックインターフェイス。 すべてのインスタンス変数を含む、最新のコンパイラの@interfaceから実装の詳細のすべてを移動できます。

+0

それは本当ではありません。 32ビットOS X Cocoa、それゆえiPhoneシミュレータでも、ヘッダ内ですべてのインスタンス変数を宣言して順序を明示する必要があります。 http://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html – Tommy

+1

を参照してください。最新の開発ツールと64ビットABIを使用して、クラス内のインスタンス変数を実際に宣言することは可能です拡張インタフェース。私が間違っていると誰かが私を修正します。 ; –

+1

;最新のiOSリリースでは、シミュレータのランタイムは32ビットですが、デバイスのランタイムと同じように機能します。 – bbum

0

後者。 wikipediaから:

オブジェクトの 部品の一部に のアクセスを制限するための言語のメカニズム。

特にObjective-Cでは、ivarはデフォルトで@protectedされるため、同じクラスまたはサブクラス内でのみアクセスできます。必要に応じて@privateまたは@publicに変更することができます。

あなたが言及したメソッドはアクセサー(ゲッターとセッター)です。この場合、@propertiesは1行で定義でき、retain、assign、copy、readonlyなどのいくつかの属性を設定できます。 プロパティの詳細については、here (Apple doc)

0

クラスメソッドと変数を一度のクラスから他のものに隠すことをカプセル化といいます。

関連する問題