objective-c - 将私有(private) Objective-C 方法或属性公开给子类

标签 objective-c inheritance subclass visibility declared-property

根据一些官方说法,Objective-C 中的类应该只在其 header 中公开公共(public)方法和属性:

@interface MyClass : NSObject

@property (nonatomic, strong) MyPublicObject *publicObject;

- (void)publicMethod;

@end

私有(private)方法/属性应该保存在 .m 文件的类扩展中:

@interface MyClass()

@property (nonatomic, strong) MyPrivateObject *privateObject;

- (void) privateMethod;

@end

而且我认为对于私有(private)但可从子类访问的事物没有protected 类型。我想知道,除了公开声明私有(private)属性/方法之外,还有什么办法可以实现这一目标吗?

最佳答案

解决这个问题的一种方法是在子类的类扩展中重新声明该属性,然后添加一个 @dynamic 语句,这样编译器就不会创建该属性的重写实现。所以像这样:

@interface SuperClass ()

@property (nonatomic, strong) id someProperty;

@end

....


@interface SubClass ()

@property (nonatomic, strong) id someProperty;

@end

@implementation SubClass

@dynamic someProperty;

@end

这显然不理想,因为它复制了一个私有(private)可见的声明。但它在某些情况下非常方便和有帮助,所以我会根据具体情况评估这种复制与在公共(public)界面中公开属性所涉及的危险。

Apple 在 UIGestureRecognizer 中使用的另一种方法是在单独的类别头文件中声明该属性,明确命名为“私有(private)”或“ protected ”,例如“SomeClass+Protected.h”。这样,其他程序员就会知道他们不应该导入该文件。但是,如果您不控制您继承自的代码,那不是一个选择。

关于objective-c - 将私有(private) Objective-C 方法或属性公开给子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12633627/

相关文章:

ios - UIImage imageWithContentsOfFile 中的路径参数 : for XCAsset

c++ - 为什么类不能继承其父类的成员类型?

c++ - 我们可以覆盖继承类的纯虚函数吗?

C# - 从基本方法完成返回

vba - 在Excel VBA中实例化另一个类中的对象

ios - 如何在 ios 中处理 AVAudioplayer 中的音量 slider 位置

objective-c - 如果@protected 是默认值,为什么这个ivar 需要@protected?

objective-c - 如何使Objective-C编译器假定未声明的属性是动态的?

python - PyTorch 数据集类的子类找不到数据集文件

objective-c - 在类别中调用 super 与在子类中调用它一样吗?