定义:抽象不应该依赖于细节。细节应该依赖于抽象。程序中所有的依赖关系都应该终止于抽象类和接口。针对接口而非实现编程。任何变量都不应该持有一个指向具体类的指针或引用。任何类都不应该从具体类派生。任何方法都不应该覆写他的任何基类中的已经实现了的方法。
说通俗一点就是,你抽象了一个类,这个类在这个工程中可以用,如果再做一个工程,移植过来还能用。遵循这一目的是为了代码的复用。不过这一条规则我觉得原则上可以遵守,但是不一定非要遵守。除非你确定目前的工程,在后续的新工程中需要复用。比如说,开发手机的系统,一般情况下后续多个型号都是以第一个开发出的那个系统为基础的。模块移植很多,这种情况下必须考虑依赖倒置原则。但是如果你正在做的工程,你很清楚这个工程,后面的开发不会再用目前的代码了,比如,下一个版本的软件要换另一种语言开发,那就没必要非得遵守这个原则了。
如何遵守依赖倒置原则呢?
1、通过构造函数或者方法传递依赖对象;
2、通过set方法传递依赖对象;
3、接口声明实现依赖对象。
结合以上三条,看下面的例子。
调用
输出:
小白使用C#开始写代码。
小白使用Java开始写代码。
这样Programer和ProgramLangvage结合,就达到了复用的目的,在其他工程中,只需对ProgramLangvage实现不同就可以了,调用programer.Coding的地方基本不用修改。
说通俗一点就是,你抽象了一个类,这个类在这个工程中可以用,如果再做一个工程,移植过来还能用。遵循这一目的是为了代码的复用。不过这一条规则我觉得原则上可以遵守,但是不一定非要遵守。除非你确定目前的工程,在后续的新工程中需要复用。比如说,开发手机的系统,一般情况下后续多个型号都是以第一个开发出的那个系统为基础的。模块移植很多,这种情况下必须考虑依赖倒置原则。但是如果你正在做的工程,你很清楚这个工程,后面的开发不会再用目前的代码了,比如,下一个版本的软件要换另一种语言开发,那就没必要非得遵守这个原则了。
如何遵守依赖倒置原则呢?
1、通过构造函数或者方法传递依赖对象;
2、通过set方法传递依赖对象;
3、接口声明实现依赖对象。
结合以上三条,看下面的例子。
例如,一个程序员开始写代码。
public class CSharp
{
public void Coding()
{
Console.WriteLine("使用C#开始写代码。");
}
}
public class Programer
{
private string name;
public Programer(string name)
{
this.name = name;
}
public void Coding(CSharp csharp)
{
Console.Write(name);
csharp.Coding();
}
}
调用:
static void Main(string[] args)
{
Programer programer = new Programer("小白");
programer.Coding(new CSharp());
Console.ReadLine();
}
输出:
小白使用C#开始写代码。
可是这样programer只会用C#,这不行的,要多学几门编程语言。c#只是一门编程语言,抽象一下。
public abstract class ProgramLangvage
{
public abstract void Coding();
}
public class CSharp:ProgramLangvage
{
public override void Coding()
{
Console.WriteLine("使用C#开始写代码。");
}
}
public class Java : ProgramLangvage
{
public override void Coding()
{
Console.WriteLine("使用Java开始写代码。");
}
}
public class Programer
{
private string name;
public Programer(string name)
{
this.name = name;
}
public void Coding(ProgramLangvage programLnagvage)
{
Console.Write(name);
programLnagvage.Coding();
}
}
调用
class Program
{
static void Main(string[] args)
{
Programer programer = new Programer("小白");
programer.Coding(new CSharp());
programer.Coding(new Java());
Console.ReadLine();
}
}
输出:
小白使用C#开始写代码。
小白使用Java开始写代码。
这样Programer和ProgramLangvage结合,就达到了复用的目的,在其他工程中,只需对ProgramLangvage实现不同就可以了,调用programer.Coding的地方基本不用修改。