接口和抽象类是面向对象中最精妙的部分。软件设计工业的两块基石。
solid设计原则,算法,设计模式
solid不是一个设计原则,而是5个面向对象设计原则的首字母的缩写,以下是这五个原则:
- Single Responsibility Principle//单一职能原则(SRP)
- Open Closed Priinciple//开放关闭原则(OCP)
- Liskov Substitution Principle/替换原则(LSP)
- Interface Segregation Principle //接口隔离原则(ISP)
- Dependency Inversion Principle //依赖反转原则(DIP)
这五个原则孕育出了几十种的设计模式,设计模式是这五个原则高阶用法。
抽象类:函数成员没有被完全实现的一种类(他的方法体都不全),abstract类的成员不能是private,因为这样子类无法访问它。
抽象类不能实例化,因为实例化之后的成员函数没有执行的逻辑,用处所在:1.作为基类,让派生类实现抽象的方法 (纯虚方法)2.可引用抽象类变量来引用基类的实例,多态的效果
(Open Closed Principle)开闭原则:把一些稳定不变的成员封装,将一些不稳定的封装为抽象类型,让子类去实现
接口包含了纯抽象类的含义:内部方法已经是abstract和public的
- 具体类---->抽象类------->接口:越来越抽象,内部实现的东西越来越少
- 抽象类是未完全实现的类(可以有字段和非public成员)他们代表了“具体逻辑”)
- 抽象类为复用而生,(对于可以复用的,就去实现它,对于不能复用的声明为抽象方法,让继承的子类去实现)具有解耦功能。
- 封装确定的,开放不确定的,推迟到子类中去实现
- 接口是完全未实现的逻辑的“类”(“纯虚类”;只有函数成员;成员全部public);
- 接口为解耦功能而生,“高内聚,低耦合‘,方便单元测试
- 接口是一个”协约“,早已为工业生产所熟知(有分工必有协作,有协作必有协约)
- 他们都不能实例化,只能用来声明变量,引用具体类的实例。
class Program { static void Main(string[] args) { Vehicle v=new RaceCar(); v.Run(); } } interface IVehicle { void Stop(); void Fill(); void Run(); } abstract class Vehicle : IVehicle { public void Stop()//可以复用的 { Console.WriteLine("Stopped"); } public void Fill() { Console.WriteLine("Pay and fill..."); } abstract public void Run();//没法复用的,使用抽象类声明为纯虚方法,让子类去实现 } class RaceCar:Vehicle { public override void Run() { Console.WriteLine("RaceCar is running"); } } class Car:Vehicle { public override void Run() { Console.WriteLine("Car is running.."); } } class Truck:Vehicle { public override void Run() { Console.WriteLine("Truck is running.."); } }