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


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

  • 相关阅读:
    TLB原理
    64寄存器位查看器
    araxis Merge
    start_KERNEL
    python 动态支持方案
    https://wenku.baidu.com/view/6142875b804d2b160b4ec06b.html 编译原理课件
    有无符号数的区别
    vim工具的路径
    edraw软件破解密钥已经上传,见文件目录
    https://tieba.baidu.com/p/2248070024
  • 原文地址:https://www.cnblogs.com/changbaishan/p/3265762.html
Copyright © 2020-2023  润新知