Jump to content
Wikipedia The Free Encyclopedia

Non-virtual interface pattern

From Wikipedia, the free encyclopedia

The non-virtual interface pattern (NVI) controls how methods in a base class are overridden. Such methods may be called by clients and overridable methods with core functionality.[1] It is a pattern that is strongly related to the template method pattern. The NVI pattern recognizes the benefits of a non-abstract method invoking the subordinate abstract methods. This level of indirection allows for pre and post operations relative to the abstract operations both immediately and with future unforeseen changes. The NVI pattern can be deployed with very little software production and runtime cost. Many commercial software frameworks employ the NVI pattern.

Benefits and detriments

[edit ]

A design that adheres to this pattern results in a separation of a class interface into two distinct interfaces:

  1. Client interface: This is the public non-virtual interface
  2. Subclass interface: This is the private interface, which can have any combination virtual and non-virtual methods.

With such a structure, the fragile base class interface problem is mitigated. The only detriment is that the code is enlarged a little.[2]

C# example

[edit ]

publicabstractclassSaveable
{
// The invariant processing for the method is defined in the non virtual interface.
// The behaviour so defined is inherited by all derived classes.
// For example, creating and committing a transaction.
publicvoidSave()
{
Console.WriteLine("Creating transaction");
CoreSave();
Console.WriteLine("Committing transaction");
}

// The variant processing for the method is defined in the subclass interface.
// This behaviour can be customised as needed by subclasses.
// For example the specific implementation of saving data to the database. 
protectedabstractvoidCoreSave();
}


publicclassCustomer:Saveable
{
publicstringName{get;set;}
publicdecimalCredit{get;set;}

protectedoverridevoidCoreSave()
{
Console.WriteLine($"Saved customer {Name} with credit limit {Credit}");
}
}

[3] [4]

See also

[edit ]

References

[edit ]
  1. ^ Carr, Richard (2011年09月03日). "Non-Virtual Interface Design Pattern". BlackWasp. Archived from the original on 2011年09月03日. Retrieved 2012年09月12日. The non-virtual interface pattern is a design pattern that controls how methods in a base class are overridden. Base classes include public, non-virtual members that may be called by clients and a set of overridable methods containing core functionality.
  2. ^ Tambe, Sumant (2007年04月11日). "Non-Virtual Interface (NVI) idiom and the design intent". C++ truths. Archived from the original on 2007年04月11日. Retrieved 2012年09月12日.
  3. ^ "Non-Virtual Interface Design Pattern". www.blackwasp.co.uk. Retrieved 2021年09月19日.
  4. ^ "Non-Virtual Interface Design Pattern (Page 2 of 2)". www.blackwasp.co.uk. Retrieved 2021年09月19日.
[edit ]

AltStyle によって変換されたページ (->オリジナル) /