受子类公开的基类中受保护的构造方法?

时间:2018-08-06 09:12:55

标签: c# abstract protected default-constructor

由于保密协议,我试图使用大量文献不完善的API,因此我无法真正说出它,因此我在描述问题时会使用一些虚构的名称。

当我尝试使用简单的var thing = new CustomThingInstance();创建一些自定义对象的实例时,编译器会发出CS1729错误(“ CustomThingInstance”不包含带有0个参数的构造函数)。

从API的元数据中,我得到了与我的问题相关的类的以下声明:

public abstract class Thing
{
    protected Thing();
    protected Thing(object reference);
    protected object Reference { get; set; }
}

public abstract class ThingWithTimeZone : Thing
{
    protected ThingWithTimeZone();
    protected ThingWithTimeZone(object reference);
    public TimeZoneInfo SourceTimeZone { get; set; }
}

public class CustomThingInstance : ThingWithTimeZone
{
    public int Id { get; set; }
    public string Message { get; set; }
}

我的第一个想法是CustomThingInstance可能正在继承ThingWithTimeZone的默认构造函数的“保护性”,但是,如果我通过复制接口并在需要的地方提供虚拟实现来复制该类结构,那么...

public abstract class MyThing
{
    protected MyThing() { }
    protected MyThing(object reference) { }
    protected object Reference { get; set; }
}

public abstract class MyThingWithTimeZone : MyThing
{
    protected MyThingWithTimeZone() : base() { }
    protected MyThingWithTimeZone(object reference) : base(reference) { }
    public TimeZoneInfo SourceTimeZone { get; set; }
}

public class MyCustomThingInstance : MyThingWithTimeZone
{
    public int Id { get; set; }
    public string Message { get; set; }
}

...然后我可以毫无问题地调用其默认构造函数:

var myThing = new MyThingCustomInstance(); // No CS1729 here

我已经通过反射检查了原始类型的构造函数,发现有2个签名与基类中的两个构造函数的签名匹配(一个不带参数,另一个带参数类型的Object)。在这两种情况下,ConstructorInfo.IsPrivate都是错误的,因此在我看来应该有一个可以从外部访问的无参数构造函数。

有人可以解释为什么不是这种情况吗?

0 个答案:

没有答案