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

Pas*_*haN 10 iphone objective-c ios 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
Run Code Online (Sandbox Code Playgroud)
  1. 我如何访问emailField -(void)myEmail method.
  2. 如何在子类中设置电子邮件-(void)setMyEmailFromSubclass; ,并在超类中访问它accessMyEmailField

Jef*_*Jef 8

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

mySuperClass + undocumentedProperties.h

#import "mySuperClass.h"

@interface mySuperClass(undocumentedProperties)

  @property (nonatomic, strong) UITextField *emailField;

 @end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

mySubclass.h

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

///some stuff
@end
Run Code Online (Sandbox Code Playgroud)

mySubclass.m

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

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

@end
Run Code Online (Sandbox Code Playgroud)

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