如何覆盖父属性(将父属性重新声明为静态变量)?

时间:2013-07-21 14:03:19

标签: objective-c inheritance concept

子类可以在子类中覆盖一个类型吗?

这里的想法是拥有一个形状类,其中包含矩形,方形,圆形等的子类。想知道是否可以覆盖父类中'shapeType'int属性的定义。像这样的东西?

e.g。在globals.h中

#define kShapeType_Rectangle = 1
#define kShapeType_Square = 2
#define kShapeType_Triskaidecagon = 13 // try pronouncing this!

in shape.h

@interface shape : NSObject
   @property int shapeType;
   @property int shapeID;
   @property UIColor shapeColor;
@end
....
在rectangle.h中

#import globals.h

@interface rectangle : shape
    @property static (nonatomic, readonly) int shapeType = kShapeType_Rectangle;  // how do I get this working?
@end

所以有两个问题:

1)这样的事情是否可能 - 即将父属性重新声明为静态变量

2)对于(1)是或否,这是这类事情的最佳编码风格吗?我没有Obj-C模式的经验,但如果存在,有人可以建议我看一下来源吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

没有Objective-C属性静态变量的概念。 Objective-C属性只是一种语法简写,用于声明两个方法,一个getter和一个setter(或者在readonly属性的情况下只是一个getter)。您可以覆盖子类中的一个或两个方法,并根据需要从子类中获取和设置值到/的静态变量/值。什么都没有阻止。

在这种情况下,你会这样做:

- (int)shapeType
{
    return kShapeType_Rectangle;
}

不要过于哲学,但拥有这样的属性似乎会在类型系统中创建冗余。换句话说,为什么必须在每个子类中覆盖一个属性?在这种情况下,当你知道实例是矩形时,为什么让shapeType返回kShapeType_Rectangle