2014-04-04 43 views
2

我想從另一個類繼承一個類,標記爲抽象類,沒有定義任何構造函數。繼承無任何構造函數的抽象類

這是我的代碼:

// In one assembly (TheMessage.dll), as seen via F12 in VS (from Metadata) 
namespace Namespace1 
{ 
    public abstract class Message 
    { 
     public string Body { get; set; } 
     // some abstract methods here, not shown. 
    } 
} 

// In another assembly (TheUser.dll) 
namespace Namespace2 
{ 
    public class MyMessage : Namespace1.Message 
    { 
     public MyMessage() 
     { 
     } 
    } 
} 

的問題是,在public MyMessage()構造我得到的錯誤

The type 'Namespace1.Message' has no constructors defined

我在MSDN網站(abstract (C# Reference)第一例),看到繼承抽象類沒有構造函數是可能的。那麼,有人知道我爲什麼會得到這個錯誤?

時注意類型是在同一個DLL作爲Message類和它的作品作爲裝配暴露了一些其他類型的Namespace1.Message類似於派生來下面是一個可以繼承就好了:

// The same assembly as Message (TheMessage.dll), as seen via F12 in VS (from Metadata) 
namespace Namespace3 
{ 
    public class Message : Namespace1.Message 
    { 
     public Message() {} 
     public Message(string to) {} 
    } 
} 

我我們也檢查了The type '...' has no constructors defined,但它沒有提到繼承,而只是提出了一個實例,我顯然沒有直接實例化抽象類的實例。

+0

你確定它沒有內部構造函數嗎? '消息'是你自己的代碼嗎?見[這個問題](http://stackoverflow.com/questions/6958358/the-type-has-no-constructors-defined)。另外,您發佈的代碼無效,正如@xxMUROxx指出的那樣。 –

+0

最後三種方法應該有修飾符'abstract' –

+0

這不是實際的代碼,所以很難說出了什麼問題...... –

回答

2

如果沒有Message類的實例構造函數是您可以看到(通常是因爲他們都是private,你的類外,或他們是全部爲privateinternal而你在組裝之外),則不能編寫從Message繼承的類。 (好吧,你可以創建兩個實例構造函數,它們使用:this(...)語法循環鏈接,但這不會有用)。請注意,當您查看「元數據」(反射生成的僞C#爲您引用的程序集)時,通常只會看到「可見」成員,因此任何privateinternal成員都不會顯示出來。我認爲你看看元數據是因爲我們看到非抽象(和非外部)方法的身體缺席(只有分號;而不是身體{ ... })。

Message類的源代碼將有一個或多個構造函數,每個構造函數爲privateinternal,但從程序集外部看時,這些是「不存在」的。

如果非靜態C#類Message的源代碼不包含實例構造函數,編譯器將自動生成一個。如果類是具體的(即非abstratc),則它將是public無參數構造函數,如果類是抽象類,則爲protected

這意味着,如果源代碼如下所示:

public abstract class Message 
{ 
    // note: zero non-static constructors here 
} 

彷彿它已經表示,它將準確地編譯:

public abstract class Message 
{ 
    protected Message() 
    { 
    } 
} 

,並在這種情況下產生的實例構造函數可以訪問到全部Message派生的類。

3

您可能有一個內部構造函數(未在您發佈的代碼中顯示)嘗試使用不同程序集的內部構造函數實例化該類。 (如果您沒有明確指定要調用的基類構造函數,則基類的默認構造函數將自動從派生類調用,因此您可能不明顯知道調用了基類構造函數。 )

例如,如果一個組件包含此類(內部名稱空間ClassLibrary1):

public class Base 
{ 
    internal Base() 
    { 
    } 
} 

和不同組件執行此:

class Derived: Base 
{ 
    public Derived() 
    { 
    } 
} 

你會看到下面的編譯錯誤:

The type 'ClassLibrary1.Base' has no constructors defined

+0

在同一個DLL中還有另一個繼承「Message」類的類。我添加了這個類的代碼。 – Albirex