2010-05-20 17 views
8

Se ho una classe con un metodo voglio protected e internal. Voglio che solo le classi derivate nell'assembly possano chiamarlo.Cosa scegli, protetto o interno?

Dal protected internal significa protectedointernal, si deve fare una scelta. Che cosa scegliete in questo caso: protected o internal?

risposta

5

voglio che le classi derivate solo in assemblea sarebbe in grado di chiamarla.

Bene, allora avete due scelte. Puoi renderlo protetto, e ogni volta che uno dei tuoi clienti estende la tua classe e chiama il tuo metodo e lo scopri, puoi scriverlo con una lettera severa dicendo loro di smettere di farlo. Oppure puoi renderlo interno e fare revisioni del codice del codice dei tuoi colleghi per assicurarti che non usino il metodo che non dovrebbero usare.

La mia ipotesi è che quest'ultima sia la cosa più economica e facile da fare. Lo renderei interno.

+3

** Esiste forse una terza scelta. ** L'OP potrebbe rendere interno * l'intera classe *, nel qual caso l'accesso "protetto" sul metodo otterrebbe il comportamento desiderato. Il codice al di fuori dell'assembly poteva accedere alla funzionalità della classe tramite un'interfaccia pubblica. Questo potrebbe essere sufficiente per ottenere il comportamento desiderato dall'OP. Lo svantaggio, ovviamente, è che tutta l'eredità al di fuori dell'assemblea sarebbe proibita ... ma l'OP non indica esplicitamente che è un requisito. – LBushkin

3

Credo che la scelta giusta sia internal. In questo modo puoi proteggere le persone esterne all'assembly dal chiamare questo metodo, e questo ti lascia solo stare attento e chiamare questo metodo solo da classi derivate. È più facile fare attenzione nell'assemblea che scrivi che sperare che gli altri facciano attenzione quando lo usano.

+2

Ulteriori informazioni qui: http://blogs.msdn.com/ericlippert/archive/2008/04/24/why-can-ti-access-a-protected-member-from-a-derived-class-part -three.aspx –

6

Personalmente sceglierei protetto. Se le sottoclassi nel proprio assembly sono sufficienti per chiamare il metodo, perché non dovrebbe creare una sottoclasse in un altro assembly? Forse potresti refactoring della funzionalità in una classe separata (interna) del tutto.

È davvero necessario pensare obiettivamente allo scopo del metodo. L'accessibilità interna mi sembra quasi sempre sbagliata. Principalmente a causa della mia esperienza nel tentativo di derivare da controlli o classi nel framework .NET in cui mi sono imbattuto in un muro di mattoni perché qualcuno ha deciso di contrassegnare una classe o il metodo come interno. L'autore originale non ha mai notato che non avere accesso a quel metodo ha reso molto più difficile l'implementazione di una sottoclasse.

EDIT

Per chiarire, l'accessibilità interna per una classe è molto utile e non ero implicando interno in generale è male. Il mio punto era che i metodi interni su una classe altrimenti pubblica mi sembrano sbagliati. Una classe base progettata correttamente non dovrebbe dare un vantaggio ingiusto alle classi derivate nello stesso assembly.

+2

+1 da me. Non penso di aver mai dovuto usare "interno". – Kobi

+0

Per quanto riguarda i casi in cui è presente una riflessione sulle classi di assieme e se la sottoclasse non viene riflessa (poiché è all'esterno dell'assieme), questo metodo non funzionerà correttamente? – brickner

+0

Domanda facile. Non ho mai dovuto usare la riflessione ':) ' – Kobi

1

È una decisione così bizzarra fare protected internal medio protected O internal. Per questo caso preciso userei internal. Il motivo è che se l'incapsulamento è rotto, preferirei che sarei io, piuttosto che qualcuno non sia sotto il mio controllo.

0

Penso che la risposta varia in base alle proprie esigenze. Se fossi in te, vorrei fare qualcosa di simile:

public class YourClass 
    { 
     protected class InnerClass 
     { 
      internal void YourMethod() 
      { 
       // Your Code 
      } 
     } 
    } 
Problemi correlati