我的iPhone应用程序有一个抽象类WorkingView。它是UIView的子类。 WorkingView反过来会有一堆具体的子类。其中两个是SimplifyView和MultiplyView。
我正在尝试编写创建WorkingView新实例的方法。此方法应该传入模式并返回适当的具体子类的实例。根据{{3}}的答案,这是我到目前为止所做的:
+ (id)newWorkingViewWithFrame:(CGRect)frame mode: (modeEnum) mode {
WorkingView *ret;
switch (mode) {
case simplifyMode:
ret = [[SimplifyView alloc]initWithFrame: frame];
break;
case multiplyMode:
ret = [[MultiplyView alloc]initWithFrame: frame];
break;
// additional cases here
default:
return nil;
}
// more initialization here
return ret;
}
到目前为止,这么好。但这是问题所在。在SimplifyView的init方法中,我需要通过UIView的init方法运行该对象。调用[super initWithFrame:frame]只能让我看到WorkingView,而不是UIView。我想我可以在WorkingView中创建一个initWithFrame:方法,该方法又调用UIView的initWithFrame:方法 - 但这感觉很乱。
处理此问题的适当方法是什么?
答案 0 :(得分:0)
如果从子类中调用[super initWithFrame:frame]
,运行时将爬上继承层次结构,寻找实现该方法的类,从super开始。如果super没有实现initWithFrame:
,那么运行时将继续攀升,直到最终找到并调用UIView中的默认实现。