Icke-virtuella gränssnittsmönster

Det icke-virtuella gränssnittsmönstret ( NVI ) styr hur metoder i en basklass åsidosätts. Sådana metoder kan anropas av klienter och överstyrbara metoder med kärnfunktionalitet. Det är ett mönster som är starkt relaterat till mallmetodens mönster . NVI-mönstret erkänner fördelarna med en icke-abstrakt metod som åberopar de underordnade abstrakta metoderna. Denna nivå av inriktning möjliggör för- och efteroperationer i förhållande till de abstrakta operationerna både omedelbart och med framtida oförutsedda förändringar. NVI-mönstret kan användas med mycket liten mjukvaruproduktion och körtidskostnad. Många kommersiella programvaror använder NVI-mönstret.

Fördelar och nackdelar

En design som följer detta mönster resulterar i en separation av ett klassgränssnitt i två distinkta gränssnitt:

  1. Klientgränssnitt: Detta är det offentliga icke-virtuella gränssnittet
  2. Underklassgränssnitt: Detta är det privata gränssnittet, som kan ha valfri kombination av virtuella och icke-virtuella metoder.

Med en sådan struktur mildras det bräckliga basklassgränssnittsproblemet . Den enda nackdelen är att koden förstoras lite.

C# Exempel

   

    
    
    
      
    
        
        
        
    
 
    
    
    
       

 
 
    

          
          
 
       
    
          
    
 public  abstract  class  Saveable  {  // Den invarianta bearbetningen för metoden är definierad i det icke-virtuella gränssnittet.  // Beteendet som definieras så ärvs av alla härledda klasser.  // Till exempel att skapa och utföra en transaktion.  public  void  Spara  ()  {  Console  .  WriteLine  (  "Skapar transaktion"  );  CoreSave  ();  Konsol  .  WriteLine  (  "Begår transaktion" )  ;  }  // Variantbehandlingen för metoden definieras i underklassgränssnittet.  // Detta beteende kan anpassas efter behov av underklasser.  // Till exempel den specifika implementeringen av att spara data till databasen.  skyddad  abstrakt  void  CoreSave  ();  }  public  class  Customer  :  Saveable  {  public  string  Name  {  get  ;  set  ;  }  public  decimal  Credit  {  get  ;  set  ;  }  skyddad  åsidosätt  void  CoreSave  ()  {  Console  .  WriteLine  (  "Sparad kund {0} med kreditgräns {1}" ,  Namn  ,  Kredit  )  ;  }  } 

Se även

externa länkar