C# 继承没有任何构造函数的抽象类
我想从另一个没有定义任何构造函数的类(标记为抽象)继承一个类 这是我的代码:C# 继承没有任何构造函数的抽象类,c#,inheritance,constructor,abstract-class,C#,Inheritance,Constructor,Abstract Class,我想从另一个没有定义任何构造函数的类(标记为抽象)继承一个类 这是我的代码: // 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
// 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()
构造函数上我得到了错误
类型“Namespace1.Message”未定义构造函数
我在MSDN站点(第一个示例)上看到,不使用构造函数继承抽象类是可能的。有人知道我为什么会犯这个错误吗
请注意,当type与Message类位于同一DLL中,并且该程序集公开从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) {}
}
}
我也检查过了,但它并没有谈到继承,只是新创建了一个实例,我显然不希望直接实例化一个抽象类的实例。您可能有一个内部构造函数(您发布的代码中没有显示)并尝试从不同的程序集中使用内部构造函数实例化该类 (如果未显式指定要调用的基类构造函数,则会从派生类自动调用基类的默认构造函数,因此调用基类构造函数对您来说可能并不明显。) 例如,如果一个程序集包含此类(在命名空间
ClassLibrary1
内):
另一个程序集执行以下操作:
class Derived: Base
{
public Derived()
{
}
}
您将看到以下编译错误:
如果消息
类的实例构造函数对您都不可见(通常是因为它们都是私有的
而您在类之外,或者它们都是私有的
或内部的
而您在程序集之外),则类型“ClassLibrary1.Base”没有定义构造函数,不能编写从消息继承的类。(好吧,您可以创建两个实例构造函数,它们使用循环地相互链接:这(…)
语法,但这并没有用)
请注意,当您查看“元数据”(为您引用的程序集生成的反射伪C)时,通常只会看到“可见”成员,因此任何private
或internal
成员都不会显示。我认为您查看元数据是因为我们看到没有实体的非抽象(和非外部)方法(只有分号;
而不是实体{…}
)
消息
类的源代码将有一个或多个构造函数,每个构造函数都是私有的
或内部的
,但从程序集外部看,这些构造函数“不存在”
如果非静态C#classMessage
的源代码不包含实例构造函数,编译器将自动生成一个实例构造函数。如果类是具体的(即非抽象的),则它将是一个公共的
无参数构造函数;如果类是抽象的,则它将是一个受保护的
构造函数
这意味着如果源代码如下所示:
public abstract class Message
{
// note: zero non-static constructors here
}
它将完全按照它所说的那样进行汇编:
public abstract class Message
{
protected Message()
{
}
}
在这种情况下,从消息
派生的所有类都可以访问生成的实例构造函数您确定它没有内部构造函数吗?消息
是您自己的代码吗?看见另外,正如@xxMUROxx所指出的,您发布的代码是无效的。最后三个方法应该有修饰符abstract
,这不是实际的代码,所以很难说出什么问题……当您尝试实例化具有内部或私有构造函数的类时,调用方看不到该类,就会发生此错误。您发布的代码不包括呼叫代码。您可能想创建一个简单的控制台程序,并将代码粘贴到您的问题中,任何人都可以尝试重现错误。@Adamhuldsworth消息
类不是我的。它来自一个DLL,因此我无法修改它。同一DLL中有另一个类继承了消息
类。我添加了这个类的代码。
public abstract class Message
{
protected Message()
{
}
}