簡體   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