【问题标题】:Private properties to subclass子类的私有属性
【发布时间】:2014-12-10 10:22:33
【问题描述】:

我有一个继承自 A 类的 B 类。 我想在 A 类中声明一些属性并在其中导入一些类,但是我不想将这些属性或类公开给 B 类的用户

简单来说,我想找到一种方法来声明只能由它的子类使用而不是那些导入它的子类的属性

【问题讨论】:

  • 不可能......你只能使用类扩展来创建私有属性,但它们也可以被访问
  • 相反,这是可能的,也是很好的做法。请看下面我的回答。

标签: objective-c iphone xcode oop


【解决方案1】:

这是完全可能的,实际上是很好的做法。

在 A.h 中,您应该只导入绝对必要的内容,例如包含您必须公开遵守的协议的标头。需要的任何其他类都应使用@class@protocol 预定义。声明您可以只读的任何属性。

@class SomeObject

@interface ClassA : NSObject
@property (strong, nonatomic, readonly) NSString *id;
@property (strong, nonatomic, readonly) SomeObject *object;
@end

在 A.m 中,您应该私下导入您需要的任何标头。此外,实现类别扩展并将任何只读属性重新声明为读写。

#import "SomeObject.h"

@interface ClassA ()
@property (strong, nonatomic, readwrite) NSString *id;
@property (strong, nonatomic, readwrite) SomeObject *object;
@property (strong, nonatomic, readwrite) NSString *entirelyPrivate;
@end

@implementation A
. . . . etc

如果您想让这些值可用于子类,但不能用于其他类,您可以将它们放在一个类别中。这也是由 Apple 框架中的几个类完成的。

例如,创建一个文件ClassA+Subclass.h 并包含:

@interface ClassA (SubclassOnly)
@property (strong, nonatomic, readwrite) NSString *id;
@end

然后只需将其导入需要“受保护”访问的子类的实现

【讨论】:

  • 您可以使用相同的技术,但将其中一些放在一个附加文件中,以允许子类访问私有值。如果您希望我扩展,请告诉我。
  • 这不是用户要求的。您仍然将这些属性暴露给导入 ClassA 的任何内容以及对其进行子类化的属性。您刚刚将它们设为只读。 Anoop Vaidya 是正确的,这是不可能的。
  • 除非我误解,否则这是不正确的。例如,entirelyPrivate NSString 正如用户所问的那样,不会暴露给子类ClassA 的类。以上提供了部分暴露和完全私有属性的示例。可以继续使用相同的模式,以按照 OP 的意愿使属性或导入完全私有。
  • 他们追求的是objective-c中的一个访问修饰符,它相当于没有受保护的javas。在objective-c中只有2个publicprivate,没有理由让一个属性完全可以被子类访问,而不是导入它的类。它要么是该类私有的,因此没有子类或导入它的类可以访问它,或者它是公共的,在这种情况下,任何导入它的类或子类都可以访问它。
  • 您在代码中所做的只是创建一个属性 (entirelyPrivate),顾名思义,它是完全私有的,并且只是使其导入或子类这个类的任何内容都只能读取 idobject 它们仍然随处可见。
猜你喜欢
  • 2019-01-30
  • 2013-06-13
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多