"Subclassing" Objective-C 中的一个变量



可能的重复项:
目标 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 中定义它将重写父类上的方法。

旁注:当您提到"子类化"属性时,正确的术语是"覆盖"。

最新更新