2010-08-17 40 views
4

在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) 
} 

顯然,這是一個代碼味道,但無論是否是一個壞主意,纔有可能調用B的Ctor從C的Ctor沒有改變AssemblyOne?

回答

5

暫時忽略Assembly Two。您將無法實例化類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

這是不可能的,即使有反思。

如果一個類沒有可訪問的構造函數,就沒有辦法創建一個繼承它的類。

1

不,您必須更改AssemblyOne。