1、复用注意事项
复用时,要尽量使用组合/聚合关系(即关联关系),少用继承
2、使用原则
一般而言,如果两个类之间是“Has-A”关系,应使用组合或聚合;如果是“Is-A”关系,可使用继承。“Is-A”是严格的分类学意义上的定义,意思是一个类是另一个类的一种;而“Has-A”则不同,它表示某一个角色具有某一项责任。
public abstract class DBUtil
{
public abstract Connection GetConnection();
}
public class OracleDBUtil:DBUtil
{
public override connection GetConnection(){......}
}
public class CustomerDAO
{
//Has A原则,表示CustomerDAO有DBUtil(需要有它,因为有了它,才能够连接数据库),或表示CustomerDAO这个角色具有连接数据库(DBUtil.GetConnection())这项责任。
private DBUtil util=null; //若字段是属性的内嵌变量,则字段与属性同名,只是首字母大小写区分;若字段与属性无关,只是类内使用,则字段建设使用“_”来标记首字符
public CustomerDAO(DBUtil util)//构造注入的方式
{
this.util = util;
}
public CustomerDAO()//构造注入的方式
{
}
public DBUtil Util
{
//get{return this.util;}//如果该属性只是为setter注入而用,则get访问器无意义了
set{this.util = value;} //setter注入
}
public void AddCustomer()
{
//获得连接 ADO.net ,OLE , ODBC
if(this.util!=null)
{
Connection conn = this.util.GetConnection();
.....................
}
else
{
.............
}
}
}
public void main(string[] strs)
{
//可使用配置文件(包括Key=ConnectClass Value=OracleDBUtil)及反射(通过反射OracleDBUtil类,来创建实例)来完成。
//DBUtil Util = new OracleDBUtil(); ----???怎么与配置文件配合,来动态生成“配置文件中配置好的”某种“数据库连接对象”
//DBUtil Util = "反射产生的Object" as DBUtil(基类);//感觉这样可以,但需要进一步验证
OracleDBUtil oracleUtil = new OracleDBUtil();//这个是写死的,若换成ACCESS,还要创建ACCESS对象,然后传入CustomerDAO构造器
CustomerDAO cusDAO = new CustomerDAO(oracleUtil);
cusDAO.AddCustomer();//实现添加客户
//setter注入模式
OracleDBUtil oracleUtil = new OracleDBUtil()
CustomerDAO cusDAO = new CustomerDAO();
cusDAO.Util = oracleUtil;
cusDAO.AddCustomer();//实现添加客户
}
1:只能继承一个基类(包括抽闲类在内)
2:但可以实现多个接口
public class DriveClass:myClass,myclass2(X)
public class DriveClass:myClass,IStudent,IPeple,ITeacher(V)
public class DriveClass:myClass //继承了myClass抽闲类,并且DriveClass为正常类(非抽象类),这样DriveClass类要"实现"myClass抽闲基类中的所有抽象方法(至少也是空实现吧)
public abstract class DriveClass:myClass
情况1:实现了myClass抽闲基类中的抽象方法,因为抽闲类可以没有抽象方法
情况2:虽然实现了myClass抽闲基类中的抽象方法,但自身有定义一个抽象方法
情况3:未实现myClass抽闲基类中的抽象方法,以继承的方式保留该抽象方法,自身未增加新的抽象方法
情况3:未实现myClass抽闲基类中的抽象方法,以继承的方式保留该抽象方法,并且又自身增加了一个新的抽象方法