c的回调函数与java中抽象函数,接口函数,抽象类简单理解


           先了解c语言的回调函数,举个简单实例步步深入,比如A程序提供给B程序使用,但是A想要调用B的代码,这样各自不同功能由B实现即可。
实例1
A:

extern int get_B_data();
void A_data_handle(){
	printf("%d\n",get_B_data());
}

B:

int get_B_data(void){
	xxx
	return xx;
}

这个程序只是简单实现到没有什么问题,当系统复杂了后问题就会慢慢显现出来。
1.某天A改了其中一个这样的函数,B就必须跟着修改,代码粘连性太强了
2.B可能只用到其中应这样的函数,其他用不上,A运行到没有这样实现的函数,肯定会crash掉
那么怎么改进呢?回调函数应运而生了
实例2
A:

typedef int (*data_cb_t)(void);
data_cb_t callback = NULL;
void init_cb(data_cb_t cb){
	callback = cb;
}
void A_data_handle(){
	if(callback){
		printf("%d\n",callback());
	}
	else{
		printf("callback()=NULL\n");
	}
}
B:

int create_data(void){
	xxx
	return xx;	
}
inti_cb(create_data);
这样二者程序就相对独立些了。

===================================================================
下面说的java的抽象函数和接口,其实基本机理和c语言的回调函数很相似。下面分析各自有什么相同和不同之处:

【抽象函数】
先来理解抽象函数,抽象函数中最重要的就是抽象二字,抽象简单理解为虚的不实在的空的。
1. 需要去填充它的这样的抽象函数,如何理解填充?也就是由子类来实现它,为什么要让子类来实现,原因是这个功能的实现不是统一代码,所以将这个自由权交给子类处理。
实例3
abstract class Animal{  
	public abstract void sounds();  
} 

class cat extends Animal{
	@Override
	void sounds() {
		System.out.println("喵喵");
	}
}
class dog extends Animal{
	@Override
	void sounds() {
		System.out.println("旺旺");
	}
} 
2.也可理解为c中的回调函数。那怎么理解回调呢?  也就是父类中要想调用子类实现代码或者其他代码想要调用一个统一的方法。
实例4
abstract class Animal{
  abstract void sounds();
  void behavior(String cmd){
  	if(cmd.equals("come here")){
  		sounds();
  	}
  }
}
这样将代码的实现和代码调用分离开来,各自相互独立,方便以后的代码管理和重构。

【接口函数】
接口函数和抽象函数功能都是类似的,既然有了抽象函数可以实现回调这样的功能,为什么还要有接口函数这样的东西呢?
原因在于抽象函数实现在子类中,子类只能继承一个类才能实现抽象函数,那问题来了。
我要实现几个类中这个抽象函数,那不就不行了吗? 是的,所以就产生了接口这样的机制,一个子类可以实现很多个接口。可以这样理解抽象函数使纵向的,接口函数使横向的,抽象函数是一条线,接口函数是一个面,抽象函数是父亲那里来的,接口是叔叔伯伯那里来的。

实例5
class ccc{
	interface a{
		void run();
	}
}
class ddd{
	interface d{
		void action();
	}
}
class test implements ccc.a, ddd.d {
	public void action() {
		
	}
	public void run() {
		
	}
}
【抽象类】
抽象简单理解为虚的不实在的空的,所以该类当然就不能拿去创建对象了,需要子类继承他,然后子类创建对象就有了抽象类的属性和方法了。