"子类" Objective-C中的变量

时间:2012-06-07 05:34:12

标签: iphone objective-c ios cocoa-touch design-patterns

  

可能重复:
  Objective C — narrow instance variable types in subclasses?

我有一个名为ParentClass的类,它具有UIView属性。我还有一个名为ChildClass的类,它是ParentClass的子类。 ChildClass显然会继承UIView属性,但在ChildClass中,我确定我只会使用UIScrollView来获取此属性。

我的问题是,是否有可能/可行地以某种方式“子化”UIView属性,重命名它,并使其成为UIScrollView?合成时我是否必须覆盖.m文件中的属性?

类似于UITableViewController的主视图属性为UITableView而不是UIView中的UIViewController

更新:也许我只是不是属性,而是变量本身。

3 个答案:

答案 0 :(得分:2)

只需添加一个具有相同名称的属性到您的子类,但使用UIScrollView而不是UIView

答案 1 :(得分:1)

如果您是ParentClass的子类,其属性为UIView,您需要ChildClass才能继承UIScrollView ..您应该只创建UIScrollView 1}} ParentClass中的属性,因此ChildClass可以继承并使用它。

如果ChildClass不会使用UIView属性,如果您从未初始化它将保持nil,因此不会耗尽任何内存。如果您选择使用UIView属性,或者当您选择使用UIScrollView属性时,也可以给您带来好处。

或者,如果您不想ChildClass

,只需在ParentClass中声明新的{{1}}媒体资源即可

希望这有意义,并且有所帮助!

答案 2 :(得分:0)

属性转换为方法,这些方法可以像任何其他方法一样被覆盖。你可以这样做:

@interface ParentClass {
    NSView* myView;
}
@property(retain) NSView* myView;
@end

@implementation ParentClass
@synthesize myView;
@end

@interface ChildClass
@end

@implementation ChildClass
-(void) setMyView:(NSView*)v;
{
    if([v isKindOfClass:[UIScrollView class]]){
        [super setMyView:v];
    } else {
        //do whatever error handling you want to here
    }
}
@end

-setMyView:方法是属性转换为的方法之一,因此在ChildClass中定义它将覆盖父类的方法。

旁注:当您引用“继承”该属性时,正确的术语是“覆盖”。