财产公共和私人但不受保护?

Posted

技术标签:

【中文标题】财产公共和私人但不受保护?【英文标题】:property public and private but not protected? 【发布时间】:2012-06-15 09:21:52 【问题描述】:

我正在学习客观的 C 语言,我问了一个简单的问题, 当我这样做时:

// ParentClass.h
@interface ParentClass : NSObject
@property (read, strong) NSString *parentPublicStr;
@end

// ParentClass.m
@interface ParentClass ()
@property (readwrite, strong) NSString *parentPrivateStr;
@end

@implementation ParentClass
@synthesize parentPublicStr;
@synthesize parentPrivateStr;
@end

// Subclass SubClass.h
@interface SubClass : ParentClass
- (void) test;
@end

@implementation SubClass
- (void) test

 // Its not possible to do that : [self setParentPrivateStr:@"myStrin"]
 // And for parentPublicStr, it is public property so not protected, because i can change the value
 // in main.c, and it's so bad..

@end

我想创建一个受保护的属性 :x

谢谢你。 (对不起我的英语)

【问题讨论】:

Objective-C - Private vs Protected vs Public的可能重复 【参考方案1】:

您可以手动为属性创建 ivar,只要您使用带有下划线前缀的相同名称:

@interface ParentClass : NSObject

    @protected
    NSString* _parentPublicStr;

@property (read, strong) NSString *parentPublicStr;
@end

这使得属性@protected(默认为@private)的合成ivar和子类可以直接使用超类的ivar。

【讨论】:

【参考方案2】:

Objective-C 不提供受保护的方法/属性。请参阅this 问题。

编辑:另见this 答案。您仍然可以通过在类扩展中声明属性并将扩展包含在子类中来练习封装。

【讨论】:

以上是关于财产公共和私人但不受保护?的主要内容,如果未能解决你的问题,请参考以下文章

ruby 公共与私人与受保护

公共与受保护

使用 keycloak 保护特定的反应页面

如何在不经过注册用户身份验证的情况下保护公共API请求

“受保护的朋友”和“私人保护”有啥区别?

PHP5 保护变量背后的推理