我在计算小时时遇到了一些问题,无法准确地覆盖我的一个子类中的方法。
我有另一个自定义类(ClassA)的子类(ClassB):
@interface ClassB : ClassA {
}
并且在ClassA
内,有一个名为:
-(void)methodName;
正确发射。
但是,我需要在ClassB
中触发此方法。
我已尝试实施(在ClassB
中):
-(void)methodName {
[super methodName];
}
但它仍然不会在ClassB
中触发。
如何覆盖methodName以便在ClassB
中触发?
答案 0 :(得分:32)
您只需在classB中的methodName中添加自定义代码:
- (void)methodName
{
// custom code
// call through to parent class implementation, if you want
[super methodName];
}
答案 1 :(得分:20)
首先,确保您的init方法创建一个ClassB对象而不是ClassA(或其他)对象。
然后,如果你想创建一个完全不同的classB(void)methodName:方法而不是在classA中找到的方法,那么这就是要走的路:
超级是超类。通过调用[super methodName],您要求ClassA执行它自己的methodName。 如果要完全覆盖classA中的methodName,则不要调用super。
所以,基本上,在你的classB的methodName实现:
-(void)methodName {
// Remove [super methodName]
// Insert the code you want for methodName in ClassB
}
请随时阅读Apple的Objective-C编程语言文档中的Messages to self and super。
答案 2 :(得分:0)
写作:
-(void)methodName {
[super methodName];
}
告诉编译器:执行Class B的methodName时,调用其超类(Class A)的methodName。因此,如果您希望B类执行不同的操作,则必须编写导致不同行为的代码。像这样:
-(void)methodName {
NSLog(@"Hello, world!");
}
现在通过调用B类的methodName“Hello,world!”将打印在控制台上。
答案 3 :(得分:0)
-(void)methodName {
[super methodName];
}
想要调用methodName(在ClassB中),只需删除[super method]然后就可以激活它。 导致super回拨给ClassA
答案 4 :(得分:-1)
虽然这个问题太老了,但每个专家都有一些学习者, 以下内容摘自Apple文档。 “新方法必须具有相同的返回类型,并采用与您覆盖的方法相同的参数数量和类型。” 完整答案可以在Apple method overriding documentation中找到 希望这有助于某人。