【问题标题】:How to overwrite parent properties (redeclaration of parent property as a static variable)?如何覆盖父属性(将父属性重新声明为静态变量)?
【发布时间】:2013-07-20 08:04:33
【问题描述】:

父类中可能有一个类型被子类覆盖?

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

例如在 globals.h 中

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

形状.h

@interface shape : NSObject
   @property int shapeType;
   @property int shapeID;
   @property UIColor shapeColor;
@end
....

在矩形.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 模式方面没有经验,但如果有的话,有人可以建议我看看的来源吗?

非常感谢!

【问题讨论】:

  • 嗨@Lucas,为什么'objective c'位从主题中删除?抱歉,还是个伪 stackoverflow 新手……
  • 标题本身不需要。它在标签中列出。第一个标签也显示在网站标题中。 @snowbound

标签: objective-c inheritance concept


【解决方案1】:

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

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

- (int)shapeType
{
    return kShapeType_Rectangle;
}

不要太哲学化,但拥有这样的属性似乎会造成类型系统的冗余。换句话说,为什么在每个子类中都有一个必须重写的属性?在这种情况下,当你知道实例是矩形时,为什么shapeType返回kShapeType_Rectangle,因为它是矩形类?

【讨论】:

  • 感谢@ipmcc 的回复,我想要一个类型属性/函数,以便可以传递形状,但我想我明白你的意思。它确实使类系统变得多余,不是 我已经用 if([myShape isMemberOf:[rectangle class]]) 代替:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
相关资源
最近更新 更多