依赖倒置(Dependence Inversion Principle)DIP
关于抽象类和接口的区别,可以参考之前的文章~http://www.cnblogs.com/leestar54/p/4593173.html
using System; using System.Collections.Generic; using System.Text; namespace DependenceInversionPrinciple { //依赖倒置(Dependence Inversion Principle)DIP //High level modules should not depend upon low level modeules.Both should depend upon abstractions.Abstractions should not depend upon details. Details shoudl depend upon abstractions. //(1)模块间的依赖通过抽象发生,实现类直接不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的。 //(2)接口或抽象类不依赖于实现类 //(3)实现类依赖接口或抽象类。 //OOD(Object-Oriented Design)面向接口编程精髓之一。 class Program { static void Main(string[] args) { //模拟这么一个场景,司机开车遇到查车情况。 Driver driver = new Driver("小李"); Benz benz = new Benz(); BMW bmw = new BMW(); //多亏了依赖倒置,这样不用在Drive函数里每次针对不同的车型写一个方法,因为它们都是车子,开起来其实是一样的,管他什么牌子。 driver.Drive(benz); //换一辆车开 driver.Drive(bmw); //这时遇到了交警,查车,千万别酒驾哟! CheckLicense(driver); } //这里使用IC1,而没有使用Driver类来做参数类,是因为交警只关注你的驾照情况,如果使用Driver类,会暴露过多的方法和属性,照成不必要的耦合风险。 static void CheckLicense(IC1 c1) { c1.ShowInfo(); } } //C1驾照接口,有了驾照的人,肯定都可以开小汽车了,不管你的职业是不是司机,这是一个共同的“行为”。 public interface IC1 { void ShowInfo(); void Drive(Car car); } public class Driver : IC1 { public Driver(string name) { this.Name = name; } private string name; public string Name { get { return name; } set { name = value; } } public void Drive(Car car) { car.Start(); car.Stop(); } public void ShowInfo() { Console.WriteLine(this.Name + "的驾照是C1驾照"); } } //抽象车子,肯定有启动和停止,至于不同车子实现方式不同,抽象出来,给子类实现。 //为什么不使用接口?这需要关注业务情况进行抽象设计,如果该业务方法涉及到其他的交通工具,如自行车,这个时候用接口,能增强扩展性,扩展一个自行车类,继承接口即可使用。 //但是这里没有涉及到,仅专注于小汽车,所以抽象类即可。 public abstract class Car { private string brand; public string Brand { get { return brand; } set { brand = value; } } public abstract void Start(); public abstract void Stop(); } public class BMW : Car { public BMW() { this.Brand = "宝马"; } public override void Start() { Console.WriteLine(this.Brand + "汽车启动"); } public override void Stop() { Console.WriteLine(this.Brand + "汽车停止"); } } public class Benz : Car { public Benz() { this.Brand = "奔驰"; } public override void Start() { Console.WriteLine(this.Brand + "汽车启动"); } public override void Stop() { Console.WriteLine(this.Brand + "汽车停止"); } } }
我不怕千万人阻挡,只怕自己投降。