利用接口与类实现类似于函数指针的功能
2017-03-23 10:48
253 查看
在 C语言中,有一个非常重要的概念——函数指针,其最重要的功能是实现回调函数。
所谓回调函数,就是指函数先在某处注册,而它将在稍后某个需要的时候被调用。在Windows系统中,开发人员想让系统动态链接( Dynamic Link Library, DDL )调用自己编写的一个方法,于是利用 DDL 当中的回调函数的借口来编写程序,通过传递一个函数的指针来被调用,这个过程就称为回调。
回调函数一般用于
函数指针一般作为函数的参数来使用,开发人员在使用时可以根据自己的需求来传递自定义的函数来实现指定的功能。 例如,在实现排序算法时,可以通过传递一个函数指针来决定两个数的先后顺序,从而最终决定该算法是按升序排序还是降序排序。
在 java 语言中没有指针的概念,那么如何才能在 java 语言中实现类似于函数指针的功能呢?
可以利用接口与类来实现同样的效果。具体而言,先定义一个接口,然后在接口中声明调用的方法,接着实现这个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现毁掉函数的功能。示例如下:
上例定义了一个比较大小的接口 IntCompare, 这个接口实际上充当了C语言中函数指针的功能,在使用时,开发人员可以根据实际需求传入自定义的类。在上例中分别有两个类 Cmp1 和 Cmp2 都实现了这个接口,分别用来在实现升序排序和降序排序时使用。其实这也是策略设计模式所用到的思想。
所谓回调函数,就是指函数先在某处注册,而它将在稍后某个需要的时候被调用。在Windows系统中,开发人员想让系统动态链接( Dynamic Link Library, DDL )调用自己编写的一个方法,于是利用 DDL 当中的回调函数的借口来编写程序,通过传递一个函数的指针来被调用,这个过程就称为回调。
回调函数一般用于
接获消息、获取系统信息或处理异步事件。
函数指针一般作为函数的参数来使用,开发人员在使用时可以根据自己的需求来传递自定义的函数来实现指定的功能。 例如,在实现排序算法时,可以通过传递一个函数指针来决定两个数的先后顺序,从而最终决定该算法是按升序排序还是降序排序。
在 java 语言中没有指针的概念,那么如何才能在 java 语言中实现类似于函数指针的功能呢?
可以利用接口与类来实现同样的效果。具体而言,先定义一个接口,然后在接口中声明调用的方法,接着实现这个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现毁掉函数的功能。示例如下:
// 接口中定义了一个用来比较大小的方法 interface IntCompare { public int cmp(int a, int b); } class Cmp1 implements IntCompare { // 升序排序 public int cmp(int a, int b) { if(a > b) return 1; else if(a < b) return -1; else return 0; } } class Cmp2 implements IntCompare { // 降序排序 public int cmp(int a, int b) { if(a > b) return -1; else if(a < b) return 1; else return 0; } } public class FuncPointer { public static void insertSort (int[] a, IntCompare cmp) { if(a != null) { for(int i = 1; i< a.length; i++) { int temp = a[i], j = i; if(cmp.cmp(a[j-1], temp) == 1) { while(j>=1 && cmp.cmp(a[j-1], temp) == 1) { a[j] = a[j-1]; j--; } } a[j] = temp; } } } public static void main(String[] args) { int[] arr1 = {7, 3, 19, 40, 4, 7, 1}; insertSort(arr1, new Cmp1()); System.out.print("升序排序:"); for(int i = 0; i < arr1.length; i++) { System.out.print(arr1[i] + " "); } System.out.println(); int[] arr2 = {7, 3, 19, 40, 4, 7, 1}; insertSort(arr2, new Cmp2()); System.out.print("降序排序:"); for(int i = 0; i < arr2.length; i++) { System.out.print(arr2[i] + " "); } System.out.println(); } }/* Output: 升序排序:1 3 4 7 7 19 40 降序排序:40 19 7 7 4 3 1 *///~
上例定义了一个比较大小的接口 IntCompare, 这个接口实际上充当了C语言中函数指针的功能,在使用时,开发人员可以根据实际需求传入自定义的类。在上例中分别有两个类 Cmp1 和 Cmp2 都实现了这个接口,分别用来在实现升序排序和降序排序时使用。其实这也是策略设计模式所用到的思想。
相关文章推荐
- Java利用接口和类来实现类似函数指针的功能
- Java中实现类似于C语言的中函数指针的功能
- 通用排序函数的功能实现(利用接口和委托实现泛型[通用]排序)
- 利用指向类成员函数的指针数组,实现更加隐蔽的接口
- Python中利用函数装饰器实现备忘功能
- 利用C++11的function和bind功能,实现QStandardItemModel的通用遍历函数
- C#动态执行类库中的函数:利用反射实现(js)Eval,asp(Execute)功能
- 利用MySQL自带的C API函数实现数据库功能调用
- php利用内置的svn函数实现的svn版本号的提交、更新、删除、恢复等功能
- java实现类似函数指针功能
- VB 6.0 利用CopyMemory实现 指针功能
- 利用Windows的API实现C语言的MD5函数功能
- 利用函数实现split功能
- 创建函数利用可变参数列表的形式模拟实现printf的功能
- C++学习 【4.1】 利用函数实现指定的功能---函数,函数的形式,函数参数
- C#利用接口实现窗体间函数调用
- 利用函数和指针实现最小数和第一个数交换,最大数和最后一个数交换
- 利用指向函数的指针数组实现计算器
- java中实现类似函数指针的功能
- ios中利用协议实现回调函数功能