2014-01-10 61 views
0

我需要從類Tool派生,因爲我必須用另一個接口IToolWrapper修飾該類。不幸的是,Tool類不提供一個拷貝構造函數,這就是爲什麼我認爲一個人不能寫DerivedTool的構造器一樣從派生類構造函數初始化基類沒有複製構造函數

public DerivedTool(String filename) : base(createToolFromFile(filename)) { 
    //... 
} 

雖然我相當肯定它不會工作,我嘗試了以下內容:

public sealed class DerivedTool : Tool, IToolWrapper { 

    static bool createToolFromFile(ref Tool tool, String filename) { 
     tool.Dispose(); 
     tool = null; 
     try { 
      tool = LoadFromFile(filename) as Tool; 
     } catch (Exception) { 
      return false; 
     } 
     return true; 
    } 

    public DerivedTool(String filename) : base() { 
     Tool tool = (Tool)this; 
     if (!createToolBlockFromFile(ref tool, filename)) throw new Exception("Tool could not be loaded!"); 
    } 

} 

在調試程序,我看到tool作爲I本地給構造變量被修改爲所需的(b/C沒有輸入捕獲情況下),但的DerivedTool底座部分(即Tool)不影響。 我該如何達到理想的行爲?

+0

我們不知道怎麼'CogToolBlock'類的工作,比你更好,除非我們知道更多一點。 – Jodrell

+1

爲什麼不創建另一個在構造函數中使用Tool實例並通過將操作轉發給所提供的Tool-instance來實現接口的類?您是否需要使用新課程來替代開箱即用的工具,例如把它交給以Tool作爲參數的方法? – Markus

+0

@Matz:問題不是很清楚......你能否詳細解釋一下細節,以便我們可以用完美的解決方案來幫助你。 –

回答

3

使用私有變量和隱性/明確的運營商像下面的組合:

public sealed class DerivedTool : IToolWrapper { 
    private Tool _tool; 

    public DerivedTool(String filename) : base() { 
     _tool = LoadFromFile(filename) as Tool; 
    } 

    public static implicit operator Tool(DerivedTool dt) 
    { 
     return dt._tool; 
    } 
} 
+0

這聽起來很合理並且適用於我的情況。謝謝。 – Matz

相關問題