2010-08-17 8 views
4

Considérez dans AssemblyOneclasse Héritant et appeler un constructeur de base cachée

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

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

Dans AssemblyTwo

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

Évidemment, cela est une odeur de code, mais peu importe si être une mauvaise idée est-il possible d'appeler le ctor de B du ctor de C sans changer AssemblyOne?

Répondre

5

Ignorer l'assemblage Deux pour le moment. Vous ne seriez pas capable d'instancier une instance de classe C, car elle hérite de B, pour laquelle il n'y a pas de constructeur public. Par conséquent, si vous supprimez le problème d'héritage de la classe C, vous aurez toujours un problème à créer des instances de la classe B en dehors de l'assemblage de B en raison des niveaux de protection. Vous pourriez utiliser la réflexion pour créer des instances de B, cependant.

Aux fins de l'essai, je modifié vos classes comme suit:

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; 
    } 
} 

J'ai alors écrit une application de la console à tester:

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(); 
    } 

Je ne recommanderais pas le faire, son juste mauvais entraine toi. Je suppose que dans tous les cas il y a des exceptions, et l'exception ici est peut-être de devoir faire face à une bibliothèque tierce que vous ne pouvez pas étendre. Cela vous donnerait un moyen d'instancier et de déboguer, sinon hériter.

2

Ceci n'est pas possible, même avec réflexion.

Si une classe n'a aucun constructeur accessible, il n'y a aucun moyen de créer une classe qui l'hérite.

1

Non, vous devez changer AssemblyOne.

Questions connexes