假设有一个项目,是这样处理的:
1.项目经理A首先写了一个接口,并规定了需要实现的函数(可看作是一个模板,分配给员工去实现这些函数);
public interface FileData
{
public abstract void readUser();
void writeUser();
}
2.程序员B分配到的任务是写这个接口的实现类来实现这些函数;
public class FileDataImp implements FileData
{
@Override
public void readUser() {
// TODO Auto-generated method stub
}
@Override
public void writeUser() {
// TODO Auto-generated method stub
}
}
3.与此同时,项目经理继续写框架,并写了一个配置文件 test.properties ;
xx=FileDataImp
注意,项目经理只需写上接口的名称“xx=”,具体的实现类名称由程序员B来写。
这样做的意义在于,项目经理不需要知道程序员B写的实现类是什么名称就可以顺利进行编写框架。
4.然后项目经理A开始了框架的编写;
ResourceBundle rb = ResourceBundle.getBundle("test");
//加载配置文件
String string = rb.getString("xx");
//读取配置文件信息
//string中间存放的值FileDataImp字符串
try
{
Class clazz = Class.forName(string);
//加载类
Constructor c[] = clazz.getConstructors();
//获得构造方法 FileDataImp
Object o = c[0].newInstance();
//调用第一个构造方法 生成FileDataImp对象
FileData fileData = (FileData)o;
//强制类型转换 子-->父 没有生成新对象 fileData存放还是之前对象的首地址
fileData.readUser();
//以父类身份调用子类重写的方法 FileDataImp的方法
} catch (Exception e) {
e.printStackTrace();
}
需要注意,实际上 构造函数的参数程序员B是不可以随意写的。