2017-04-11 77 views
1

我想從DocX繼承,整合Word文檔的互操作打印:「DOCX」不包含一個構造函數0參數

public class WordDoc : DocX { 
    static private Microsoft.Office.Interop.Word.Application wordApp; 

    static WordDoc() { 
    } 
} 

但是當我嘗試,我得到這個錯誤:

'DocX' does not contain a constructor that takes 0 arguments

從元數據我可以看到,根本沒有定義構造函數,所以我認爲應該生成空的構造函數。我也不提供我的基類的構造函數。

我確實有靜態構造函數,但是當我刪除它時,仍然會得到相同的錯誤。你正試圖從繼承

+0

「從元數據我可以看到,沒有構造函數是在所有定義的,所以我認爲空構造應被生成「。不,如果編譯器會生成任何默認構造函數*,那麼元數據中就會有這樣的構造函數。 –

+0

你有鏈接到DocX的任何文檔嗎? –

+0

@JonSkeet https://docx.codeplex.com/ –

回答

1

如果你看一下source code,你會看到一個構造函數確實宣稱:

internal DocX(DocX document, XElement xml) 
     : base(document, xml) 
{ 
} 

儘管如此,考慮到它標記爲internal,它似乎是這個類是意成爲公共API,因此,您不應該試圖直接實例化或繼承它。

相反,所有的examples似乎都依託於該類靜態Create方法:

public static DocX Create(string filename, 
    DocumentTypes documentType = DocumentTypes.Document) 
{ 
    // Store this document in memory 
    MemoryStream ms = new MemoryStream(); 

    // Create the docx package 
    //WordprocessingDocument wdDoc = WordprocessingDocument.Create(ms, 
     DocumentFormat.OpenXml.WordprocessingDocumentType.Document); 
    Package package = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite); 

    PostCreation(package, documentType); 
    DocX document = DocX.Load(ms); 
    document.filename = filename; 
    return document; 
} 
+0

@BartFriederichs哎呀,我絕對做到了,謝謝你:)。更新。 –

1

類有一個內部構造:

internal DocX(DocX document, XElement xml) 
    : base(document, xml) 
{ 
} 

所以你不能從該類繼承。如果省略默認的構造函數,編譯器會產生這樣的:

public WordDoc() : base() { 

} 

base()構造函數是無法訪問的(內部)。如果您創建默認構造函數:

public WordDoc() { 

} 

編譯器仍然會增加調用base(),因爲你不能從類繼承並以某種方式忽略任何調用這個基類的構造函數。

因此,而不是繼承 - 使用其他方式,如擴展方法,代理類等等,具體取決於您正在解決的具體問題。

相關問題