お互いのプロパティにアクセスできるようにしたいクラスが2つありますが、それらのプロパティに他の場所からアクセスしたくありません。これを行う方法はありますか?サブクラス化によってこれを達成する唯一の方法はありますか?2つのクラスの間に「特別な」関係を確立する方法はありませんか?
5 に答える
私があなたの質問を理解するならば、あなたは事実上、継承によって無関係であるクラスAとクラスBに、公に宣伝されているよりも多くの内面を認識させたいですか?
Aには、innardsForB
Bのインスタンスのみがアクセスする必要があるというプロパティがあります。クラス拡張を使用して、Aへの非公開インターフェースを宣言できます。
ああ
@interface A:NSObject
... regular class goop here ...
@end
A-Private.h
@interface A()
@property(nonatomic, strong) Innards *innardsForB;
@end
午前
#import "A.h"
#import "A-Private.h"
@implementation A
// because "A-Private.h" is #import'd, `innardsForB` will be automatically @synthesized
...
@end
Bm
#import "B.h"
#import "A-Private.h"
@implementation B
...
- (void)someMethod
{
A *a = [self someASomewhere];
a.innardsForB = [[Innards alloc] initForMeaning:@(42)];
}
プロトコルはその目的のために設計されています。サードパーティのクラスによるプロトコルの実装または使用を停止することはできません。これらのメソッドはパブリックですが、必ずしもパブリックインターフェイスの一部ではありません。
classAがclassBのプロパティにアクセスし、classCがClassBでclassAの参照を宣言し、ClassBで宣言しないようにしたいのですが。
例 :
@interface ClassA
@property (nonatomic, strong) UILabel *label1;
@end
#import "ClassB.h"
#import "ClassA.h" // To access public properties and all methods declared in ClassA.h
@implementation ClassB
ClassA *classA = ....;
classA.label1.text = ...;
@end
この例から、ClassBはClassAのすべてのパブリック(CalssA.hで宣言)プロパティとメソッドにアクセスできます。
デリゲートを使用してこれを行うこともできます。
obj-cではプロパティが保護されます。つまり、継承によってのみプロパティにアクセスできます。
@interface A : NSObject{
NSObject* prop;
}
@end
@implementation A
@end
@interface B : A
@end
@implementation B
- (void)protected{
self->prop; // yep
}
@end
@interface XXX : NSObject
@end
@implementation XXX
- (void)test{
A* a = [[A alloc] init];
a->prop; // wrong, will not compile
}
@end
メソッドを介して非表示のプロパティにアクセスする場合は、実装で非表示のカテゴリを使用するか、ブリッジを使用できます。しかし、2つのクラス間に「特別な」関係を確立する方法はありません。ただし、この関係をコード設計に適用することはできます。