0

Ci-dessous le parent & Classe enfant.Essayer de comprendre la chaîne d'héritage

public class ParentController : ApiController 
{ 
    public ICustomer customer { get; set;} 
    public ICustUtil util { get; set;} 

} 


public class ChildController : ParentController 
{ 
    //no issue here 
    public string Get() 
    { 
     customer = util.GetCustomers(); 
    } 

} 

Si je fais les propriétés de la classe parent comme protégée & essayez de les utiliser, je reçois Object NULL reference Exception

public class ParentController : ApiController 
{ 
    protected ICustomer customer { get; set;} 
    protected ICustUtil util { get; set;} 

} 


public class ChildController : ParentController 
{ 
    //Object Null reference exception at run time here 
    public string Get(){ 
    customer = util.GetCustomers();} 

} 

Je suis en train de comprendre comment fonctionne-t-il la différence mise à jour public-protected spécificateur d'accès.

S'il vous plaît noter: -

  • J'utilise Castle Windsor DI contenant

S'il vous plaît ne pas tenir compte convention de nommage pour l'instant.

+0

@ Kgn-web: Non, ce code ne sera pas compilé. Vous avez besoin de quelque chose comme 'public class ParentController: ApiController'. Alors votre code 'ChildController' ne compilera pas non plus, car vous avez une non-déclaration directement dans la déclaration de classe. S'il vous plaît fournir un [mcve]. (Je vous conseille fortement de connaître les conventions de nommage .NET.) –

+0

@JonSkeet, Mon erreur de faute de frappe. Je m'excuse sincèrement pour cela –

+0

La raison de votre exception concernant vos erreurs de compilation est probablement que vous n'instantiez jamais votre propriété 'utils' dans votre classe' ChildController'. – HimBromBeere

Répondre

2

Je suppose que vous instanciez des instances de ces classes via un conteneur IoC tel qu'AutoFac et que vous utilisez l'injection Setter. Sinon, je ne peux pas voir comment le premier exemple fonctionnera jamais, puisque vous n'initialisez jamais util.

Lorsqu'un membre est protégé, un conteneur IoC ne peut pas l'initialiser. Seuls les membres publics peuvent être accédés par le code en dehors de la classe elle-même.

+0

Oui.Vous avez deviné correct. J'utilise Castle Windsor DI conteneur (FYI - je l'ai mentionné dans mon article) –

+0

Sincères remerciements pour l'affichage de ceci. Je ne le savais pas. :) –