类扩展中的属性的可见性和目标C中的继承

cfi*_*her 8 inheritance cocoa properties objective-c class-extensions

假设我有2个课程:Money和Dollar,其中Dollar继承自Money.

Money具有在类扩展中声明的属性:

#import "Money.h"

@interface Money ()
@property(nonatomic) NSUInteger amount;
@end

@implementation Money

@end
Run Code Online (Sandbox Code Playgroud)

Dollar继承了这个属性,但是在Dollar中的方法中看不到它.我可以通过在Dollar.m中重新声明属性来"修复":

@interface Dollar ()
@property(nonatomic) NSUInteger amount;
@end
@implementation Dollar


}
@end
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢这个,我甚至不确定我知道编译器在做什么:

  1. 它只是让财产可见吗?
  2. 它是在创造一个新的属性和新的iVar并且"遮蔽"前一个吗?

除了类及其子类的实现之外,为每个人隐藏属性的最佳方法是什么?

理想情况下,我不希望在.h文件中显示数量,因为它是一个实现细节.

War*_*ton 10

在回答第一个问题时,可能是第一个选择.它只是Money在编译时将所有内容混合在一起.编译器和预编译器很聪明.

您可以使用私有标头来完成您要执行的操作

一个公共头文件Money.h

//Money.h 
@interface Money : NSObject
//public decl 
@end
Run Code Online (Sandbox Code Playgroud)

一个私有子类的头文件金钱,Private.h

//Money-Private.h
@interface Money ()
@property(nonatomic) NSUInteger amount;
@end
Run Code Online (Sandbox Code Playgroud)

这是由实现Money和任何子类或类别使用的,例如

美元Dollar.h公众面孔

#import "Money.h"
@interface Dollar:Money
@end
Run Code Online (Sandbox Code Playgroud)

和实施Dollar.m

#import "Money-Private.h"
@implementation Dollar

-(void)foo
{
    self.amount = 75;
}

@end
Run Code Online (Sandbox Code Playgroud)

如果您选择创建公共框架,请确保仅将公共标头复制到捆绑包中.