合成复用(组合/聚合复用原则)

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抽闲基类中的抽象方法,以继承的方式保留该抽象方法,并且又自身增加了一个新的抽象方法

原文地址:https://www.cnblogs.com/changbaishan/p/3265762.html