我有 2 个类,我希望能够访问彼此的属性,但我不希望从其他任何地方访问这些属性。有没有办法做到这一点?是通过子类化来实现这一点的唯一方法吗?有没有办法在两个类之间建立“特殊”关系?
问问题
846 次
5 回答
12
如果我理解您的问题,您实际上希望与继承无关的 A 类和 B 类了解比公开宣传更多的内部信息吗?
假设 A 有一个属性,称为innardsForB
只有 B 的实例才能访问。您可以使用类扩展来声明 A 的非公共接口。
啊
@interface A:NSObject
... regular class goop here ...
@end
A-私人.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)];
}
于 2013-03-26T14:46:54.433 回答
3
协议就是为此目的而设计的。您不能阻止 3rd 方类实现或使用协议。其中的方法是公共的,但不一定是公共接口的一部分。
于 2013-03-26T14:15:40.230 回答
1
于 2013-03-26T14:20:19.557 回答
-1
我希望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 中声明)属性和方法。
您也可以使用委托来执行此操作。
于 2013-03-26T14:30:26.493 回答
-8
在 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
如果你想通过方法访问隐藏的属性,你可以简单地使用隐藏在实现中的类别,或者桥接。但是没有办法在两个类之间建立“特殊”关系。但是您可以在代码设计中强制执行这种关系。
于 2013-03-26T14:29:25.523 回答