使用System.Data.Common.DbConnection;第一个
直接使用 DbConnection db=new DbConnection()是错误的。
但是使用 DbConnection db=new SqlConnection()这样是可以的。
为什么是这样的?不是说没有实现接口的类是不能实例化的吗?
这样的原理是不是类似于,父类和子类继承的关系?  因为SqlConnection是继承于DbConnection
所以DbConnection类型的变量可以用SqlConnection类实例化?第二个
同样还有一个函数public void init(DbConnection db)    
1.在这里只是定义了一个DbConnection 类型的变量,并未实例化,所以是可以的?
他期待的应该是已经被实例化的一个变量传进来,比如说SqlConnection的或者是OracleConnection的凡是实现IDbConnection接口的都可以的.一旦变量传进来以后这个db就是传进来那个变量的类型,而不是DbConnection变量的类型了?2.如果定义DbTransaction trans= conn.BeginTransaction();  这个trans应该是传进来SqlConnection.BeginTransaction()所创建的SqlTransaction类型数据。请问我这样理解对吗?

解决方案 »

  1.   

    1.System.Data.Common.DbConnection是一个抽象类,不包括具体的实现,不能够直接创建实例.所以你直接new 是不行的.这和你类和子类是不一样的
      

  2.   

    2.OracleConnection,SqlConnection也属于DbConnection类型,因为他实现了DbConnection
      
      
      

  3.   

    第一个问题
    DbConnection实现了IDbConnection接口,做为所有Connection的父类来使用.
    但它并不提供一个共有构造函数,也就是不可以实例化.
    但他是SqlConnection是DbConnection的子类,从面向对象的角度来说SqlConnection的对象是可以给DbConnection的.第二个问题
    当一个子类对象付值给父类时,
    表面上它是变成了父类,但在空间上它还是子类的对象,通过强制的类型转换还是可以转换为子类的.
    这时父类调用的其实是子类的方法
      

  4.   

    第一个
    public abstract class DbConnection : Component, IDbConnection, IDisposable
    继承层次是这样的:
    System.Object 
       System.MarshalByRefObject 
         System.ComponentModel.Component 
          System.Data.Common.DbConnection
             System.Data.Odbc.OdbcConnection 
             System.Data.OleDb.OleDbConnection 
             System.Data.OracleClient.OracleConnection 
             System.Data.SqlClient.SqlConnection 
             System.Data.SqlServerCe.SqlCeConnection DbConnection 是抽象类,这就决定了它不能被实例化。System.Data.Odbc.OdbcConnection ,System.Data.OleDb.OleDbConnection ,        System.Data.OracleClient.OracleConnection ,System.Data.SqlClient.SqlConnection ,     System.Data.SqlServerCe.SqlCeConnection 都继承自DbConnection ,也就是说他们都“是”DbConnection。所以在接受DbConnection类型参数 的地方,你都可以传递这几个类的实例。第一个:
    直接使用 DbConnection db=new DbConnection()是错误的。 //抽象类不能被实例化
    但是使用 DbConnection db=new SqlConnection()这样是可以的。 //子类的实例赋值给父类第二个:
    public void init(DbConnection db)    “比如说SqlConnection的或者是OracleConnection的凡是实现IDbConnection接口的都可以的.”这句话不对,init(DbConnection db)  方法接受一个DbConnection类型的参数,DbConnection实现了IDbConnection接口。 在需要子类的地方,不能直接用父类或父接口替换。你可以自己写一个实现凡是实现IDbConnection接口的类,直接传递给这个init(DbConnection db) 编译器会报错。
    改成 init(IDbConnection db),那就“凡是实现IDbConnection接口的都可以”。2.这样理解是对的。
    private void button10_Click(object sender, EventArgs e)
            {
                 DbConnection dbConn = new SqlConnection();
                 System.Console.WriteLine("dbConn is SqlConnection ? " + (dbConn is SqlConnection));
                 System.Console.WriteLine("dbConn is DbConnection ? " + (dbConn is DbConnection));
                 System.Console.WriteLine("dbConn is IDbConnection ? " + (dbConn is IDbConnection));
                 //.....设置连接串等
                 DbTransaction trans = conn.BeginTransaction();
                 System.Console.WriteLine("trans is SqlTransaction ? " + (trans is SqlTransaction));
                 System.Console.WriteLine("trans is DbTransaction ? " + (trans is DbTransaction));
            }
    输出:
    conn is SqlConnection ? True
    conn is DbConnection ? True
    conn is IDbConnection ? True
    trans is SqlTransaction ? True
    trans is DbTransaction ? True