答えて
技術的に、プロパティは本当に単なるメソッドであり、すべてのメソッドはpublicです。 Objective-Cのメソッドを「保護する」方法は、他の人にそれらを知らせないことです。
実際、はいです。クラス拡張のプロパティを定義することができますが、メインの実装ブロックでは@synthesize
のままです。
サブクラスの実装では、このような構文を使用できます。
@interface SuperClass (Internal)
@property (retain, nonatomic) NSString *protectedString;
@end
このソリューションの仕組みについての簡単な説明を追加できますか? – HairOfTheDog
これは、基本クラスとサブクラスの両方の実装ファイルに含めるクラス拡張(カテゴリではない)を使用することで可能です。
クラスの拡張がカテゴリに似て定義されていますが、カテゴリ名なし:クラスの拡張で
@interface MyClass()
、あなたはバッキングアイバーズを合成することができるようになりますこれ、プロパティを宣言することができます(XCodeの> 4.4イーバールの自動合成もここでも機能します)。
拡張クラスでは、プロパティをオーバーライド/リファインすることができます(読み込み専用に変更して読み込みなど)、実装ファイルに「可視」になるプロパティとメソッドを追加できます(プロパティとメソッドは本当にプライベートであり、依然としてセレクタによって呼び出すことができます)。
その他これに別々のヘッダファイルMyClass_protected.hを使用して提案しているが、これはまた、このような#ifdef
を使用して、メインヘッダーファイルで行うことができる。
例:
BaseClass.h
@interface BaseClass : NSObject
// foo is readonly for consumers of the class
@property (nonatomic, readonly) NSString *foo;
@end
#ifdef BaseClass_protected
// this is the class extension, where you define
// the "protected" properties and methods of the class
@interface BaseClass()
// foo is now readwrite
@property (nonatomic, readwrite) NSString *foo;
// bar is visible to implementation of subclasses
@property (nonatomic, readwrite) int bar;
-(void)baz;
@end
#endif
BaseClass.m
// this will import BaseClass.h
// with BaseClass_protected defined,
// so it will also get the protected class extension
#define BaseClass_protected
#import "BaseClass.h"
@implementation BaseClass
-(void)baz {
self.foo = @"test";
self.bar = 123;
}
@end
ChildClass.h
// this will import BaseClass.h without the class extension
#import "BaseClass.h"
@interface ChildClass : BaseClass
-(void)test;
@end
ChildClass.m
// this will implicitly import BaseClass.h from ChildClass.h,
// with BaseClass_protected defined,
// so it will also get the protected class extension
#define BaseClass_protected
#import "ChildClass.h"
@implementation ChildClass
-(void)test {
self.foo = @"test";
self.bar = 123;
[self baz];
}
@end
あなたが#import
を呼び出すと、それは基本的にあなたがそれをインポートしているところに.hファイルを、ペーストにコピーします。 #ifdef
がある場合は、その名前の#define
が設定されている場合にのみコードが内部に含まれます。
.hファイルでは、このクラスをインポートするすべてのクラスが保護されたクラス拡張を表示しないように、定義を設定しません。 基本クラスおよびサブクラス.mファイルでは、#import
を使用する前に#define
を使用して、コンパイラに保護されたクラス拡張が含まれるようにします。
- 1. UIViewControllerとそのすべてのサブクラスにプロパティを追加する
- 2. Doctrine_Recordクラスのサブクラスを模倣し、そのプロパティをスタブする方法は?
- 3. プロパティとしてのNSObjectサブクラス
- 4. UIViewとそのサブクラスで異なるメソッドを持つ同じプロパティ
- 5. 抽象基本クラスとそのサブクラスのWCF DataContract
- 6. クラスとサブクラスの印刷
- 7. サブクラス 'プロパティから基本クラス'コンストラクタにアクセス
- 8. Persist UITableViewCellサブクラスのプロパティ
- 9. クラスのサブクラスOwlApi
- 10. Javascriptの「クラス」:サブクラス
- 11. クラスとそのサブクラスのインスタンスの間のサブクラスのパスを見つける方法は?
- 12. Virtuosoのオントロジーのリストとそのプロパティとクラスを取得
- 13. サブクラスは基本クラスのプロパティの情報を必要とします
- 14. UIViewサブクラスとそのサブビューのIBAction
- 15. OWLの等価クラスとサブクラスの混合
- 16. Djangoでのクラスとサブクラスのフィルタリング
- 17. UIButtonサブクラス - プロパティの設定?
- 18. 私のクラスのサブクラスのリスト
- 19. 埋め込みブートストラップクラスのプロパティ別のクラス
- 20. PHPクラスは、そのプロパティにシングルトンとのアクセスを拡張し
- 21. 基本クラスとサブクラスのJava等価メソッド
- 22. Java:クラスはそれ自身のサブクラスですか?
- 23. NSManagedObjectサブクラスの悩み
- 24. Realmオブジェクトのサブクラスのプロパティにアクセスできないサブクラス
- 25. Python - 抽象クラスのサブクラス化
- 26. compositeidを持つクラスのサブクラス
- 27. Protege OWL 2クラスのサブクラス
- 28. VB.Net - クラスのサブクラスを使用
- 29. typescriptクラスの読み取り専用プロパティ
- 30. Swiftのシングルトンとクラスのプロパティ
"保護される"ためには、クラス拡張インタフェースは、クラスとそのサブクラスに含まれる別のヘッダファイルにある必要があります。 – JeremyP
基本クラスのインターフェイス拡張で宣言されたプロパティは、サブクラスでは使用できません。つまり、スコープはプライベートで保護されていません。このSOの議論を参照してください:http://stackoverflow.com/questions/5588799/objective-c-how-do-you-access-parent-properties-from-subclasses – memmons
@ハルコーニャンセレクターを宣言した場合、あなたはいつでも呼び出すことができますそれ。単にその宣言を隠す以外の方法を「保護する」というようなものはありません。 Objective-Cには、保護されたメソッドまたはプライベートメソッドの概念がありません。保護された象牙のみ。 –