【问题标题】:Visibility of properties in Class Extensions and inheritance in Objective C类扩展中属性的可见性和 Objective C 中的继承
【发布时间】:2013-06-16 01:24:27
【问题描述】:

假设我有 2 个类:Money 和 Dollar,其中 Dollar 继承自 Money。

Money 在类扩展中声明了一个属性:

#import "Money.h"

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

@implementation Money

@end

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

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


}
@end

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

  1. 只是让属性可见吗?
  2. 它是否创建了新属性和新 iVar 并“遮蔽”了前一个?

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

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

【问题讨论】:

    标签: objective-c cocoa inheritance properties class-extensions


    【解决方案1】:

    在回答第一个问题时,可能是第一个选项。它只是在编译时将 Money 的所有内容一起平滑。编译器和预编译器很聪明。

    您可以使用私有标头来完成您想要做的事情

    一个public头文件Money.h

    //Money.h 
    @interface Money : NSObject
    //public decl 
    @end
    

    子类Money-Private.h

    private头文件
    //Money-Private.h
    @interface Money ()
    @property(nonatomic) NSUInteger amount;
    @end
    

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

    美元的公众Dollar.h

    #import "Money.h"
    @interface Dollar:Money
    @end
    

    和实施Dollar.m

    #import "Money-Private.h"
    @implementation Dollar
    
    -(void)foo
    {
        self.amount = 75;
    }
    
    @end
    

    您是否应该选择创建公共框架,然后确保只有公共标头被复制到包中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-23
      • 2012-11-11
      • 2012-01-05
      • 2012-06-17
      • 2011-10-29
      • 2012-11-30
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多