Objective-C:如何从子类访问父私有属性?

时间:2013-12-27 01:15:06

标签: ios iphone objective-c ios6 ios7

//Super class .h file

@interface MySuperClass : NSObject

@end

//Super class .m file

@interface MySuperClass ()

@property (nonatomic, strong) UITextField *emailField; 

@end

@implementation MySuperClass

-(void)accessMyEmailField {

   NSLog(@"My super email: %@", self.emailField.text);

}

@end


// ********** my subclass *******

//Subclass .h file

@interface MySubClass : MySuperClass

@end

//SubClass .m file

@interface MySubClass ()

@end

@implementation MySubClass

-(void)myEmail {

   NSLog(@"My subclass email: %@", self.emailField.text);

}

-(void)setMyEmailFromSubclass{

   self.emailField.Text = @"email@gmail.com"

}

@end
  1. 如何在-(void)myEmail method
  2. 中访问emailField
  3. 如何在子类-(void)setMyEmailFromSubclass中设置电子邮件; ,并在超级accessMyEmailField
  4. 中访问它

3 个答案:

答案 0 :(得分:8)

您可以在第二个头文件中放置这些属性的访问者,并在“需要知道”的基础上导入该文件。 例如

mySuperClass + undocumentedProperties.h

#import "mySuperClass.h"

@interface mySuperClass(undocumentedProperties)

  @property (nonatomic, strong) UITextField *emailField;

 @end

mySuperClass.m

#import "mySuperClass+undocumentedProperties.h"

@interface mySuperClass()
///stuff that truly will be private to this class only
// self.emailField is no longer declared here..
@end

@implementation mySuperClass

@synthesize emailField; //(not really needed anymore)

/// etc, all your code unaltered
@end

mySubclass.h

#import "mySuperClass.h"
@interface mySubclass:mySuperClass

///some stuff
@end

mySubclass.m

#import "mySubclass.h"
#import "mySuperClass+undocumentedProperties.h"
@implementation

//off you go, this class is now 'aware' of this secret inherited property..

@end

显然MySuperClass.m必须导入这个.h文件以及它的默认文件(或者实际上不是,默认的是内置于此文件中),但你的子类也可以导入它(直接进入它们的。 m文件,所以这些属性对于类是私有的。这不是一个合适的类别,因为没有相应的mySuperClass + undocumentedProperties.m文件(如果你尝试过,你无法为这些秘密属性合成支持iVars。享受:) < / p>

答案 1 :(得分:1)

从超类中复制所需方法的私有接口部分 - 或者换句话说,在Subclass.m文件中复制:

@interface MySuperClass ()
@property (nonatomic, strong) UITextField *emailField; 
@end

(将其置于现有@interface MySubClass ()代码之上)

现在你的子类知道该方法存在于超类中并且可以使用它,但你不会将它暴露给任何其他人。

答案 2 :(得分:1)

私有财产的重点正是如此,你不应该想要访问它们。因为它们是私有的,所以可以更改或删除它们,从而打破依赖它们的子类。

据说他们并非真正私密,只是没有“发表”。可以调用,因为Objective-C是一种运行时动态语言。