可能的重复项:
目标 C — 子类中的窄实例变量类型?
我有一个名为 ParentClass
的类,它具有 UIView
属性。我还有一个名为ChildClass
的类,它是ParentClass
的子类。 ChildClass
显然继承了UIView
属性,但ChildClass
我知道我肯定只会对此属性使用UIScrollView
。
我的问题是,是否有可能/可行以某种方式"子类化"UIView
属性,重命名它,并使其只能是一个UIScrollView
?合成时是否必须覆盖 .m 文件中的属性?
类似于UITableViewController
的主视图属性是UITableView
而不是UIViewController
中的UIView
。
更新:也许我的意思不是属性,而是变量本身。
只需将具有相同名称的属性添加到子类中,但使用 UIScrollView 而不是 UIView
即可。
如果你正在子类化ParentClass
,它有一个UIView
的属性,你需要ChildClass
继承一个UIScrollView
。您应该只在ParentClass
中创建一个UIScrollView
属性,以便ChildClass
可以继承和使用它。
如果ChildClass
不使用 UIView
属性,如果您从未初始化它,它将保持nil
,因此不会占用任何内存。如果您选择使用UIView
属性,也可以为您提供好处。
或者,如果您不想在 ChildClass
中声明一个新的 UIScrollView
属性,只需在 ParentClass
希望这是有道理的,并且有帮助!
属性将转换为方法,并且可以像其他方法一样重写这些方法。你可以做这样的事情:
@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
中定义它将重写父类上的方法。
旁注:当您提到"子类化"属性时,正确的术语是"覆盖"。