2010-01-27 62 views
1

我想模擬使用基類的接口和實例(而不是直接從基類派生)從基類(不可訪問)派生。C#:僅使用接口和其實現實例來模擬繼承 - 是否有可能?

讓我試着更好地解釋一下:我有一個暴露的接口和一個(隱藏的)類實現。

在另一個模塊中,我創建了接口的第二個實現,並將其從第一個模塊傳遞給隱藏類的實例。

我想第二個實施做什麼:

  • 它代表的接口方法的默認實現
  • 它可以覆蓋任何接口方法
  • 它可以從
  • [中導出棘手的部分]代碼從調用虛擬方法的默認實現中調用該類的重寫方法或從它派生的類。

請記住,我不能直接從默認實現派生!

描述它的最好方法就是一個例子。

組件A:

internal class DefaultImpl: IMyInterface { 
    public virtual void MyMethod(){ 

     //call a virtual method vvvv 
     Console.WriteLine(this.GetString()); 
    } 
    public virtual string GetString(){ 
     return "default implementation"; 
    } 
} 

public Interface IMyInterface { 
    void MyMethod(); 
    string GetString(); 
} 

------ 

大會B:

class BaseExtraImpl: IMyInterface { 
    public BaseExtraImpl(IMyInterface i_implementation){ 
     /* magic happens here */ 
    } 
    public virtual void MyMethod(){ /*delegate to implementation*/ } 
    public virtual string GetString(){ /*delegate to implementation*/ } 
} 
class ExtraImpl: BaseExtraImpl{ 
    public ExtraImpl(IMyInterface i_implementation): base(implementation) {} 

    public override string GetString(){ 
     return "extra implementation"; 
    } 
} 

用法:

DefaultImpl def; 
     // ^^^ this is initialized to an instance of DefaultImpl; 
     //  it doesn't matter how. 

ExtraImpl extra = new ExtraImpl(def); 
extra.MyMethod(); //should print "extra implementation" 
+1

是否有一個很好的理由,你的基類已經交付沒有能力從它繼承? – Lazarus 2010-01-27 12:51:44

+0

只有一個:它不在我的控制之下:( – 2010-01-27 13:18:46

回答

0

姆,這將始終輸出"default implementation"。我看到的唯一選擇是實現您自己的IMyInterface版本,可能會從DefaultImpl複製代碼(如果允許的話),但我認爲這實際上是您避免執行的操作。

+0

是的,這正是我試圖避免:) – 2010-01-27 12:48:31

0

你可以看到此前一篇文章How To Access Internal Class from External Assembly

但是,它的要點是,您可以將「InternalsVisibleTo」程序集屬性應用於程序集A,以便程序集B可以查看和訪問Default實現,但只有在您控制了程序集源代碼的情況下才有效。否則,您需要使用反射來創建程序集B中的默認實例,然後在您的方法中調用反射對象上的方法。

+0

我有約束不能從B引用A(我必須忍受它)。但是,我可以很容易地在程序集B中獲得實現*的實例* - 無需反思。 – 2010-01-27 13:16:44

2

你需要的是在c#中混入可能性。不幸的是c#沒有這些。可能是你可以在這裏找到答案:Is it possible to implement mixins in C#?

+0

感謝您的鏈接。這是一個有趣的閱讀 – 2010-01-28 09:42:49

相關問題