子类中没有后备实例变量

时间:2015-02-06 19:54:47

标签: objective-c inheritance

我有一个来自NSObject - Rectangle的子类,它的子类 - Square

在Rectangle.h中我有属性:

@property int height, width;

Im实现文件我手动声明支持变量:

@implementation Rectangle
{
    int _width;
    int _height;
}

我的问题是:在我的子类Square中直接从Rectangle - @interface Square : Rectangle继承,我想使用在超类中声明的变量。但是,我无法通过_width_height看到它们,但只能相应地调用getter方法 - self.width[self setWidth:x]

是的,使用getter方法没有问题,但为什么我不能使用合成的后备变量(在我的情况下手动声明)?即使是儿童班,这是否会受到某种程度的保护?

4 个答案:

答案 0 :(得分:1)

您只是在头文件中声明它们。就您的子类而言,该头文件表示其父接口。正式地说,它不知道私有实例变量,只知道公共属性。

答案 1 :(得分:1)

是的,它们是私有的,因此可以删除/重命名,这会破坏子类。即使它们是合成的后备变量,您仍然不知道确切的实现是什么。

如果你真的需要在子类中访问它们,你可以创建一个单独的标题和/或使用@private

答案 2 :(得分:1)

如果您希望能够直接访问子类(类似于public或C ++中的protected),可以在接口块中声明它们:

@interface MyClass : NSObject {
    NSInteger _asdf;
}

在Objective-C非脆弱实例变量增强之前,声明实例变量的功能仅在@interface块中可用,并且这些变量随处可用。也可以使用@private指令锁定变量。

所以,回答你的问题:在@interface块中声明变量将允许你直接访问它们,但我会谨慎,因为语言现在好得多,因为它可以隐藏实现细节。

答案 3 :(得分:1)

如果要使用在子类中的超类中创建的ivars,请在超类的.h文件中声明这些ivars(而不是属性)。此外,您不应该“手动声明”.m文件中的后备实例变量,因为您自动获得这些变量。

@interface Rectangle : NSObject {
    int height;
    int width;
}