2009-09-11 59 views
4

是否可以將接口注入到我無法更改的現有第三方類中?像擴展方法一樣,但是用於接口(以及它已經注入的類的實現)。接口注入

我喜歡選擇使用兩個類似的第三方庫之一,通過給兩個庫中類似的類使用相同的接口。所以我不必把那裏的課程轉換成我的課程。

+1

我喜歡這一點。我後來在博客上發表了一段話:http://www.madprops.org/blog/imposing-interfaces-onto-classes-with-extension-methods/ – 2009-09-11 06:17:00

+0

這真是令人遺憾的事情是,類在事後並不能適應接口,在Haskell中用類型和類型來完成。 – 2009-09-11 06:19:07

回答

1

只要你在處理接口,爲什麼不直接把類包裝到自己的類中去實現接口呢?

0

你應該看看Decorator Pattern,它允許你通過構圖來擴展一個類。

例如 它實現了InterfaceA鑑於密封A類:

public interface InterfaceA 
{ 
    int A {get; set;} 
} 

public sealed Class A : InterfaceA 
{ 
    public int A {get;set;} 
} 

你可以擴展了InterfaceA,然後使用一個修飾的B類來封裝類A的一個實例,並提供額外的方法。

public interface MyExtendedInterfaceA : InterfaceA 
{ 
    int B {get;set} 
} 

public class B : MyExtendedInterfaceA 
{ 
    private InterfaceA _implementsA = new A(); 

    public int A 
    { 
     get 
     { 
      return _implementsA.A; 
     } 
     set 
     { 
      _implementsA.A = value; 
     } 
    } 

    public int B {get; set;} 
} 

另外,裝飾C類可以添加一個全新的界面:

public interface InterfaceC 
{ 
    int MethodC(); 
} 

public class C : InterfaceA, InterfaceC 
{ 
private InterfaceA _implementsA = new A(); 

    public int A 
    { 
     get 
     { 
      return _implementsA.A; 
     } 
     set 
     { 
      _implementsA.A = value; 
     } 
    } 

    public int MethodC() 
    { 
     return A * 10; 
    } 
} 
+0

看起來你沒有仔細閱讀我的問題。如果A類是第三方庫類之一,我將無法添加InterfaceA。 – Martin 2009-09-11 11:24:38

+0

看起來你錯誤地解釋了我的意思;我在概述A類結構,它可以在你自己的代碼或第三方庫中。無論哪種方式,它是密封的,你不能改變它。 B類和C類是您在自己的課程中編寫的代碼。 – 2009-09-11 11:27:24