2010-10-29 43 views
2

我需要在部分單獨的程序集中定義一個類。實際上,我需要重新定義一個類,這已經在使用C++ Cli編寫的程序集中定義,但這也許是另一個問題。
的情況下,C#編寫的所有代碼,我有一個基類定義basenamespace裝配沒有找到合適的方法來覆蓋部分類錯誤

using System; 

namespace BaseNameSpace 
{ 
    public class BaseClass 
    { 
    public int Num; 
    public double dNum; 
    public BaseClass(int s, double d) 
    { 
     Num = s; 
     dNum = d; 
    } 

    public virtual void Wrt() 
    { 
     Console.WriteLine("{0},{1}", Num, dNum); 
    } 
    } 
} 

我添加名爲derivedclassSpace另一個組件項目,並宣佈從基類派生的derivedclass。我也爲這個項目添加了一個部分類定義。

using System; 
using BaseNameSpace; 

namespace BaseNameSpace 
{ 
    public partial class BaseClass 
    { 
    public void Mult() 
    { 
     Num *= 2; 
    } 
    } 
} 

namespace DerivedNameSpace 
{ 
    public class DerivedClass : BaseClass 
    { 
    public DerivedClass(int s) 
     : base(s, 0) 
    { 

    } 

    public override void Wrt() 
    { 

     Mult(); // mult line 
     base.Wrt(); 
    } 
    } 
} 

當我生成解決方案我得到

'DerivedNameSpace.DerivedClass.Wrt()': 發現重寫

如果刪除了局部類線沒有合適的方法和多線,一切都很正常。
我使用partial關鍵字的概念嗎?我怎樣才能擺脫錯誤?

回答

7

您不能在組件中定義分部類。部分類(和部分方法)只是編譯器功能,允許您將文件中的定義分開。一旦彙編被編譯,就有一個類。你唯一真正的選擇是繼承基類,添加你的函數,然後從這個新類繼承更多派生類。

但是,如果您所要做的只是將方法添加到現有類中,您可能會考慮擴展方法。雖然這實際上並沒有將其添加到類本身,但它確實允許您像編寫代碼一樣編寫代碼。

namespace BaseNameSpace 
{ 
    public static class BaseClassExtensions 
    { 
    public static void Mult(this BaseClass instance) 
    { 
     instance.Num *= 2; 
    } 
    } 
} 

namespace DerivedNameSpace 
{ 
    public class DerivedClass : BaseClass 
    { 
    public DerivedClass(int s) 
     : base(s, 0) 
    { 

    } 

    public override void Wrt() 
    { 

     Mult(); // mult line 
     base.Wrt(); 
    } 
    } 
} 
+2

確實。部分類是C#語言的一個特性,而不是.Net平臺的特性,所以一旦某種東西被編譯爲IL,就不再有能力使用部分類。 – 2010-10-29 14:51:42

+0

@Steve:事件比較好說 - C#編譯器 – abatishchev 2010-10-29 14:53:36

+0

它說名字'Mult'在當前上下文中不存在。我認爲這將是 「BaseClassExtensions.Mult(this);」 – 2010-10-29 15:01:33

0

是否有可能從基類繼承併爲派生類創建中間基類?這樣,您可以根據需要添加缺少的功能,並保持原始基類的類型依賴性。即使它能夠工作,我也會對使用部分類跨越程序集邊界擴展基類感到慚愧。

相關問題