2015-08-05 22 views
5

ho il seguente codice:Forza classe figlia per implementare metodo privato

public abstract class NavEntityController<ChildEntity> where ChildEntity : NavObservableEntity 
{ 
    public abstract void Delete(ChildEntity line); 
    public abstract void Update(ChildEntity line); 
    public abstract void Create(ChildEntity line); 

    public void PushChangesToNav(NavObservableCollection<ChildEntity> lines) 
    { 
     foreach (var line in lines) 
     { 
      line.ErrorLastAction = false; 
      EntityState previousState = line.CurrentState; 

      try 
      { 
       switch (line.CurrentState) 
       { 
        case EntityState.Unchanged: 
         break; 
        case EntityState.NeedsCreate: 
         Create(line); 
         line.CurrentState = EntityState.Unchanged; 
         break; 
        case EntityState.NeedsUpdate: 
         Update(line); 
         line.CurrentState = EntityState.Unchanged; 
         break; 
        case EntityState.NeedsDelete: 
         Delete(line); 
         line.CurrentState = EntityState.Deleted; 
         break; 
       } 
      } 
      catch (Exception e) 
      { 
       //... 
      }   
     } 
    } 
} 

ho bisogno di una classe base per ereditare da questa classe, come ad esempio:

public class NavJobController : NavEntityController<NavObservableJob> 
{ 
    public NavJobController({} 

    public override void Delete(NavObservableJob line) {//Implementation here} 
    public override void Update(NavObservableJob line) {//Implementation here} 
    public override void Create(NavObservableJob line) {//Implementation here} 

    //Other functionality 
} 

Tuttavia, non voglio qualcuno di essere in grado di fare:

NavJobController j = new NavJobController(); 
j.Create(new NavObservableJob()); 

ma solo vorrebbe il seguente metodo:

j.PushToNav(); // e qualsiasi altra funzionalità pubblica nella classe di base per essere disponibile

In sostanza, voglio forzare la classe figlia per implementare le operazioni CRUD, senza esporli al pubblico. La sintassi ideale speravo in è il seguente:

private abstract void Delete(ChildEntity line); 
private abstract void Update(ChildEntity line); 
private abstract void Create(ChildEntity line); 
+2

Usa 'abstract' protetta. –

risposta

13

Questo è il motivo per cui esiste protected visibilità (visibile sia per classe di base e classi derivate, ma non disponibili al pubblico di usarli da un'istanza).

Se avete bisogno di accedere pubblicamente questi metodi da qualche parte nella soluzione, potrebbe essere necessario utilizzare internal invece di protected e rendere visibili interni ad alcune assemblee che utilizzano l'attributo [InternalsVisibleTo].

+0

Ho sempre evitato la protezione per questo: http://stackoverflow.com/questions/3182653/are-protected-members-fields-really-that-bad .. Ho ora riletto e visto solo si applica alle proprietà – David

+1

@David Questo è solo un parere. –

+0

@David quella risposta è molto esagerata. Non c'è nulla di intrinsecamente sbagliato nei membri protetti, o almeno non più dei membri pubblici. – CodeCaster

1

Il modo per farlo è utilizzare protected abstract. Questo espone i metodi ai tipi discendenti, ma non agli estranei, oltre a far rispettare il fatto che il discendente discendente deve implementare il metodo.

Quindi questo è come si potrebbe dichiarare:

public abstract class NavEntityController<ChildEntity> where ChildEntity : NavObservableEntity 
{ 
    protected abstract void Delete(ChildEntity line); 
    protected abstract void Update(ChildEntity line); 
    protected abstract void Create(ChildEntity line); 

    ... rest of class 
Problemi correlati