【发布时间】:2013-12-27 22:01:13
【问题描述】:
我正在学习 Paul Hegarty 在 iTunesU 上关于开发 iOS7 应用程序的课程。在作业 3 中,我被要求将我的视图控制器抽象化,然后创建它的两个具体子类。原始视图控制器中的出口在.m 文件中声明如下:
@interface CardGameViewController ()
@property (weak, nonatomic) IBOutlet UIlabel *scorelabel;
@end
我的问题是CardGameViewController 的子类不知道这些属性,因为我认为它们是私有的。
在他的任务提示中,Paul 提出了一个想法来解决这个问题,而无需公开这些插座属性声明:
"如果你继承了 UIViewController 的子类,你可以连接到 超类的出路和动作只需手动打开 Xcode 助手编辑器中超类的代码(与 故事板)并像往常一样按住 ctrl 拖动到它。在 换句话说,您不需要创建超类的出口和 动作公开(通过将它们放在其头文件中)只是为了连接到 他们用 ctrl-drag (很可能实现这整个 分配而不公开单个出口或行动)。”
我的问题是:这是否意味着任何使用这些插座属性的代码都必须存在于超类实现中?或者有没有办法让我的子类访问这些属性?
【问题讨论】:
-
你正在使用的IDE(Xcode)与这个问题的连接在哪里?
-
原始视图控制器的出口连接是通过使用 Xcode 从故事板上的 UIView 拖动到视图控制器 .m 文件来实现的。
-
我明白你的意思,但我仍然不确定 Paul Hegarty 的以下提示是什么意思:“在 Objective-C 中没有像“受保护”这样的概念。不幸的是,如果一个子类想要要在代码中(不使用 ctrl-drag)向其超类发送消息,这些方法(包括属性)必须公开。一个好的面向对象设计通常会将内部实现的发布保持在最低限度!"
-
在某些语言中有一个
protected修饰符,这意味着访问将仅限于子类。在 Objective-C 中根本没有限制属性访问的方法,你所能做的就是改变它的可见性。如果一个类看不到一个属性,它就不能使用它——因此将它放在实现中是最接近私有化的方法。
标签: objective-c inheritance uiviewcontroller ios7