2017-08-12 18 views
1

說我有一個類庫,這樣的引用:在類庫執行代碼時,你不必到類庫

using ClassLibrary2; 

     namespace ClassLibrary1 
    { 
     public class Class1 : IClass1 
     { 
      public string SayHello() 
      { 
       return "Hello"; 
      } 
     } 
    } 

和類庫是這樣的:

namespace ClassLibrary2 
    { 
     public interface IClass1 
     { 
      string SayHello(); 
     } 

     public class Class3 
     { 
      IClass1 _class1; 

      public Class3(IClass1 class1) 
      { 
       _class1 = class1; 
       string test = _class1.SayHello(); 
      } 
     } 
    } 

和一個這樣的程序:

namespace WindowsFormsApplication1 
    { 


      public partial class Form1 : Form 
      { 
       public Form1() 
       { 
        InitializeComponent(); 
        IClass1 class1 = new Class1(); 
        Class3 class3 = new Class3(class1); 
       } 
      } 
     } 

ClassLibrary1 references ClassLibrary2。 WindowsFormsApplication1引用ClassLibrary1和ClassLibrary2。

程序結束。即使ClassLibrary2不引用ClassLibrary1,ClassLibrary2也能夠從ClassLibrary1執行代碼。這種技術叫做什麼?我想了解更多信息並使用它。我意識到它是多態的。我指的是在沒有依賴性的情況下在類庫中執行代碼的技術。

回答

3

您在SOLID中發現了D:依賴倒置原理。

針對接口進行編程,而不是實現。

你是不是從ClassLibrary2中的ClassLibrary1執行代碼,您正在調用您在ClassLibrary2本身中定義的接口中描述的功能。
在運行時,您所調用的實現可能由ClassLibrary12635提供。

其中這可能非常有用的一個示例是,如果我爲單獨庫中的DAL(數據訪問層)組件定義接口,則定義該DAL組件的功能。我可以使用該接口在業務邏輯層(BLL)中實現業務邏輯(我需要通過接口引用庫)。

對於我的DAL本身,我可以實現不同的實現,並創建兩個不同的庫 - 例如一個使用本地客戶端存儲,另一個使用集中式數據庫。然後,我可以用另一個DAL庫替換另一個DAL庫,而無需在業務邏輯中更改單行代碼。

+0

謝謝。我認爲依賴倒置是很好的做法。什麼是classlibrary12635? +1用於SOLID參考。 – w0051977

+0

'classlibrary12635'只是另一個可以存在的類庫,或者你可以寫或可能出現的類庫,它恰好也實現了'IClass1'接口。重點在於ClassLibrary3不管它是ClassLibrary1,classlibrary12635還是實現IClass1的「somethirdpartylibrary」,只要它工作。 – oerkelens