简介
抽象类和接口在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(){ ... } }