2013-02-06 121 views
0

SquareGeo,TriangleGeo从Geo类驱动。
每个SquareGeo,TriangleGeo类都具有相同参数但内容不同的drawMe方法。从ObjectiveC中调用子方法(IOS6)

我wantto从基类调用drawMe是地理 但是,问题导航仪说,我一个警告:

"Instance method '-drawMe' not found (return type defaults to 'id')" 

的结论是:
我如何可以调用从父方法,该方法只被定义它的所有小孩班。

我应该避免警告吗?我应该使用协议吗? 看起来像这样:

[sub drawMe]; //not super 

任何想法? (请不要将我引用到java examples.only objectC专有技术)

+0

它只是一个警告。如果真的困扰你,那么就创建一个正式的协议(也就是在父类上声明该方法)。当然,如果你决定***不是***也声明一个正式的协议,那么强烈建议你在调用它之前检查你的对象实际上是否响应'drawMe'方法。 – Perception

+0

所以你的意思是我寻找什么的神奇钥匙? –

+0

在这里添加协议似乎很奇怪。基类知道它将调用一个方法,'self'是接收器,因此在这种情况下没有其他类可以真正使用这个协议。 –

回答

0

克服这个问题的最简单方法是在父类中提供一个空的实现。

如果你想确保子类都提供自己的实现,那么你可以例外添加到基类的方法

@implementation Base 

- (void)drawMe; 
{ 
    [NSException raise:NSInternalInconsistencyException 
     format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; 
} 
+0

是不是有一个在ObjectiveC中的抽象方法定义? o.h.n.o –

+0

IIRC这是最接近你可以得到 –

+0

如果我们在子类中定义drawMe与异常提升者(如你所说) 它会调用overriden?或基类的方法? 我认为,覆盖真的覆盖。对吗?所以这种方法似乎适用和最接近的解决方案 –

1

这就是关于继承的美丽事物,您在父级声明方法并在子级中实现它,并且底层系统处理调用“正确”该方法的版本取决于实例的实际类型。

+0

是的。 drawMe将用协议定义。 所以,一个针重写它。确保是可以从超类返回 否则我必须为每个子类重复定义相同的方法;它在超类中使用drawMe。 –

+0

如果您在协议中定义它,请确保父类实现该协议,否则,在父类中声明方法,而不是协议 –

+0

,那么我可以避免警告吗? ,因为我确定该方法在超类 –