回调函数
Java和C++编程中都常用到回调函数
对象A具有某些接口 对象B实现这些接口并由对象A在某个时机调用实现的接口
C++:纯虚函数实现
class test {
public:
virtual void call()=0;
};
class child : public test {
void call() {
cout << "child call" << endl;
}
};
class demo {
public:
void setListener(test *listener) {
mListener = listener;
}
void call() {
mListener->call();
}
private:
test *mListener;
};
Java:interface 实现
class test {
public interface listener{
void call();
}
private listener mListener;
public void setListener(listener listen) {
mListener = listen;
}
public void call() {
mListener.call();
}
}
class child implements test.listener {
public void call() {
System.out.println("child call");
}
}
class demo {
private
public void static main() {
child b = new child();
test a = new test();
a.setListener(b);
a.call();
}
}
回调函数的作用
比较典型的应用就是通知UI更新某些元素
1. 通过socket接收到消息了 更新UI的内容
2. 触发某些预先设定的动作 比如按键事件
Object-C的实现
1. Object-C的protocol关键字
protocol很类似java中的interface 都是抽象出接口
不同之处则在于java中接口必须全部被实现 oc中则可以通过@require和
@optional(不必实现)来控制接口是否实现.
2. id<xxx> 实现xxx接口的对象
这类似于java的
public interface test {...};
private test mListener;
示例代码
header.h:
@protocol listener
-(void) call;
@end
@interface header : NSObject {
id<listener> mListener;
}
-(void) setListener:(id<listener>) listen;
-(void) call;
@end
header.m:
#import "header.h"
@implementation header
-(void) setListener: (id<listener>) listen
{
mListener = listen;
}
-(void) call
{
[mListener call];
}
@end
test.h:
@interface test : NSObject <header>
@end
test.m:
@implementation test
-(void) call
{
NSLog(@"test call");
}
@end
main.m:
int main() {
test *a = [[test alloc] init];
header *b = [[header alloc] init];
[b setListener:b];
[b call]
}