定義:抽象不應該依賴於細節。細節應該依賴於抽象。程式中所有的依賴關係都應該終止於抽象類別和介面。針對介面而非實現編程。任何變數都不應該持有一個指向具體類的指標或引用。任何類都不應該從具體類派生。任何方法都不應該覆寫他的任何基類中的已經實現了的方法。
說通俗一點就是,你抽象了一個類,這個類在這個工程中可以用,如果再做一個工程,移植過來還能用。遵循這一目的是為了代碼的複用。不過這一條規則我覺得原則上可以遵守,但是不一定非要遵守。除非你確定目前的工程,在後續的新工程中需要複用。比如說,開發手機的系統,一般情況下後續多個型號都是以第一個開發出的那個系統為基礎的。模組移植很多,這種情況下必須考慮依賴倒置原則。但是如果你正在做的工程,你很清楚這個工程,後面的開發不會再用目前的代碼了,比如,下一個版本的軟體要換另一種語言開發,那就沒必要非得遵守這個原則了。
如何遵守依賴倒置原則呢?
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的地方基本不用修改。