繁体   English   中英

继承类并调用隐藏的基础构造函数

[英]Inheriting class and call hidden base constructor

在AssemblyOne中考虑一下

public class A
{
    internal A (string s)
    { }
}

public class B : A
{
    internal B (string s) : base(s)
    { }
}

在AssemblyTwo中

public class C : B
{
    // Can't do this - ctor in B is inaccessible
    public C (string s) : base(s)
}

显然这是代码味道,但无论是否一个坏主意,是否可以在不更改AssemblyOne的情况下从C的ctor调用B的ctor?

暂时忽略组装二。 您将无法实例化C类的实例,因为它继承自B,没有公共构造函数。

因此,如果从C类中删除继承问题,由于保护级别的原因,在B的程序集之外创建B类实例仍然存在问题。 但是,您可以使用反射来创建B的实例。

出于测试目的,我按如下方式更改了您的类:

public class A
{
    internal A(string s)
    {
        PropSetByConstructor = s;
    }

    public string PropSetByConstructor { get; set; }
}

public class B : A
{
    internal B(string s)
        : base(s)
    {
        PropSetByConstructor = "Set by B:" + s;
    }
}

然后我写了一个控制台应用程序来测试:

static void Main(string[] args)
    {
       System.Reflection.ConstructorInfo ci = typeof(B).GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[0];
        B B_Object = (B)ci.Invoke(new object[]{"is reflection evil?"});

        Console.WriteLine(B_Object.PropSetByConstructor);


        Console.ReadLine();
    }

我不建议这样做,这只是不好的做法。 我想在所有事情中都有例外,这里的例外可能不得不处理你无法扩展的第三方库。 如果不是继承,这将为您提供实例化和调试的方法。

即使有反射,这也是不可能的。

如果类没有可访问的构造函数,则无法创建继承它的类。

不,您必须更改AssemblyOne。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM