C#2.0学习4—面向对象高级概念
一、接口
1. 接口的概念及作用
一个例子:一台电脑上的主板和光驱,其实对主板来说,光驱只要是符合它所要求的规格就可以了,具体是哪种光驱,并不重要,它都能兼容。如果我更换一个光驱,没有必要连主板也换。
当我们需要一个新的对象时,我们首先考虑,能否定义一个和原有对象功能一致的对象(兼容),而不是修改原有对象,或者做一个全新的对象
再如:一个数据库系统中对数据的SIUD操作,我们应该如何设计呢,假设我们的系统是不能确定具体的数据库,或者用户要求变更到新的数据库时,那我们是否要重新设计整个数据访问层及与其相关的调用呢?
我们定义一个接口:
interface IDataAccess
{
public bool insert(Item)
public bool delete(string id)
public bool update(Item)
public List getData();
public Item getDataById(string id);
}
如果我们使用Sqlserver
我们就定义一个类实现上述接口
class SqlDataAcess : IDataAcess
{
//具体的sqlServer的操作
}
而在上层程序调用时我们可以简单的使用如下形式调用
Item item= new Item();
IDataAcess da = new SqlDataAccess(); //此处如果应用反射可从配置文件中直接初始化对象,而不需如此硬编码
//IDataAcess da = DataAccessFactory.createInstance(Configration.getDataType);
Da.insert(item);
现在如果要更换成Oracle,大家想应该如何做了
class OracleDataAcess : IDataAcess
{
//具体的OracleServer的操作
}
再把配置文件中的DataType改为Oracle就行了,整个系统不用更改其它代码
如下图:
2. 接口的特性
为了应对可变化的需求,应该针对接口编程,而非针对具体类编程
针对完成相同功能的程序,要提供一致的程序接口,方便程序的即插即用
代码的实现是在具体类中,而非接口中,接口只声明程序的功能,并不实现
二、抽象类
与接口类似,但它可以包含属性,也可实现方法
三、面向对象设计原则
1.单一职责原则(SRP):
一个类应该仅有一个引起它变化的原因。
2.开放封闭原则(OCP):
类模块应该是可扩展的,但是不可修改(对扩展开放,对更改封闭)
3.Liskov 替换原则(LSP):
子类必须能够替换它们的基类
4.依赖倒置原则(DIP):
高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
抽象不应该依赖于实现细节,实现细节应该依赖于抽象。
5.接口隔离原则(ISP):
不应该强迫客户程序依赖于它们不用的方法。
四、设计模式与多态应用
多态的应用很广泛,有很多模式都用到它。如:工厂方法,策略,模板模式等
所谓设计模式:是指前人的一种编程经验。
上面的数据库系统的例子就是应用到工厂方法模式
一个产品接口:IDataAccess 实现一致的数据操作
两个具体实现类:SqlDataAccess和OracleDataAccess 分别是具体数据库访问的实现
一个工厂类:DataAccessFactory 作用为针对不同的配置,生成不同的DataAccess
示例演示(演员表演节目项目)
用到的模式:工厂方法
多态的应用