c# 抽象类 接口


简介

抽象类和接口在c#编程中,主要作用为类提供一个抽象机制,
由于c#具有这种机制,才使得c#具有面向对象的能力。
由于使用抽象类和接口,我们才能更好的 封装、优雅的继承类和接口,使类具有多态的功能


定义方式


抽象类和接口类所定义采用的关键字不同

   abstract定义类
   public abstract class newBaseClass{
        public abstract void fun1();
        public abstract void fun2();
   } 
 
   interface定义类
   
   public interface  newIBaseClass{
        void fun1();
	void fun2();
   }
 


共同点

abstract 和 interface都可以对继承的对象限制其行为,
interface是abstract的一种特殊形式。
abstract 和 interface都不可以进行实例化。


不同点

1 abstract 可以被类继承,但不能被interface继承
interface既可以被类继承,也可以被interface继承
2 一个类只能继承一个abstract类,但可以继承多个interface接口
3 abstract可以添加一个数据类型,构造函数,普通方法,达到类的默认行为实现
interface不可以实现任何操作,只能作为 “行为约束的定义”,即接口中不可以定义变量,
不可以定义实现方法,只能定义抽象方法

4 abstract主要体现继承属性(主要对一类相同事物进行定义),
interface主要应用于能力行为的控制



应用场景

当我们设置一个类时,我们需要从类和接口的不同点上分析和斟酌使用类还是接口
进行类的定义。

如果想定义一些基础方法, 并需要设置默认实现,需使用抽象类
如果涉及多继承,需要使用接口

例:
我们需设计一个数据库操作类,支持MSSQL Oracle MySql …
由于这些类属于一类对象 is 数据库对象,都具有基本功能 CRUD
针对这种情况我们首先 需定义一个抽象类,然后所有数据库操作都继承这个抽象类,实现基本功能,
达到数据库的基本操作功能。

 
  public abstract class DbOperBase{
      abstract void   getConn();
      abstract string insert();
      abstract string update();
      abstract string delete();
      abstract string search();
  }

  ----MSSQL操作类
  public class MssqlDbOper:DbOperBase
  {
      void   getConn(){
          ...
      }
      string insert(){
          ...
      }
      string update(){
          ...
      }
      string delete(){
          ...
      }
      string search(){
          ...
      }
  }

  ----Oracle 操作类

  public class OracleDbOper:DbOperBase
  {
      void   getConn(){
          ...
      }
      string insert(){
          ...
      }
      string update(){
          ...
      }
      string delete(){
          ...
      }
      string search(){
          ...
      }
  }

  ----Mysql操作类
  public class MysqlDbOper:DbOperBase
  {
      void   getConn(){
          ...
      }
      string insert(){
          ...
      }
      string update(){
          ...
      }
      string delete(){
          ...
      }
      string search(){
          ...
      }
  }

——….

例:oracle有内存数据库,具有内存数据库的操作方式,那么我们将为oracle单据定义一些接口

public Interface IMemStore
{
    string memInsert();
}



  ----改写Oracle 操作类

  public class OracleDbOper:DbOperBase:IMemStore
  {
      void   getConn(){
          ...
      }
      string insert(){
          ...
      }
      string update(){
          ...
      }
      string delete(){
          ...
      }
      string search(){
          ...
      }
  
      string memInsert(){
          ...
      }
  }