代码之家  ›  专栏  ›  技术社区  ›  Ryan

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

c#
  •  4
  • Ryan  · 技术社区  · 14 年前

    在第一部分中考虑

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

    在装配二

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

    显然这是一种代码味道,但是不管这是不是一个坏主意,从C的ctor调用B的ctor而不更改AssemblyOne是可能的吗?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Jonathan Bates    14 年前

    暂时忽略集合2。您将无法实例化类C的实例,因为它继承自B,而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();
        }
    

    我不建议你这样做,这只是一种不好的做法。我想所有的事情都有例外,这里的例外可能是必须处理第三方库,而您不能扩展它。这将为您提供一种实例化和调试(如果不是继承的话)的方法。

        2
  •  2
  •   SLaks    14 年前

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

        3
  •  1
  •   Adam Sills    14 年前

    不,你必须换一个。