Interface Examples
This page was last reviewed on Dec 13, 2021.
Dot Net Perls
Interface. With a VB.NET Interface we create a contract. Each class in a VB.NET program that implements the interface must have certain functions.
Using abstraction, we call those Functions through an Interface reference. The exact type of an Object is no longer needed. More code is shared. A program becomes simpler.
An example. This program declares an IValue Interface, which requires one method (Render). The Content and Image classes both implement IValue.
And These two classes, Content and Image, implement IValue.Render in different ways. The Implements keyword is used.
Detail A new Dictionary is created and three String keys are added. They point to two Image class instances and one Content instance.
Then The TryGetValue function is invoked twice. When the IValue is retrieved from the Dictionary, the Render sub is called.
Result The specialized implementation being called from the general Interface type.
Interface IValue Sub Render() End Interface Class Content : Implements IValue Public Sub Render() Implements IValue.Render Console.WriteLine("Content.Render") End Sub End Class Class Image : Implements IValue Public Sub Render() Implements IValue.Render Console.WriteLine("Image.Render") End Sub End Class Module Module1 Sub Main() ' Create dictionary of Interface type instances. Dim dict As Dictionary(Of String, IValue) = New Dictionary(Of String, IValue) dict.Add("cat1.png", New Image()) dict.Add("image1.png", New Image()) dict.Add("home.html", New Content()) ' Get value from Dictionary and call their Render methods. Dim value As IValue = Nothing If dict.TryGetValue("cat1.png", value) Then value.Render() End If ' Again. If dict.TryGetValue("home.html", value) Then value.Render() End If End Sub End Module
Image.Render Content.Render
Property. An Interface can specify a Property. On implementing classes, all aspects of the Property (like ReadOnly, WriteOnly) must be preserved.
Detail Here we implement a Size property from the IWidget interface. We can set, and read, Size from an IWidget reference.
Interface IWidget Property Size As Integer End Interface Class Widget Implements IWidget ''' <summary> ''' Size property implementation. ''' </summary> Property Size As Integer Implements IWidget.Size End Class Module Module1 Sub Main() ' Use Size Property on Interface. Dim w As IWidget = New Widget w.Size = 10 Console.WriteLine(w.Size) End Sub End Module
IEnumerable. Many interfaces exist in the .NET Framework, but IEnumerable is an important one. It is implemented by classes that provide "enumeration" over elements, in a For-Each loop.
Next Consider this program. It uses just one method, DisplaySize, to handle both arrays and Lists.
Important With the interface, we avoid duplicating our code for each type (array, List). This makes programs easier to maintain.
Module Module1 Sub Main() ' Use String array as IEnumerable. Dim values() As String = {"cat", "dog", "mouse"} DisplaySize(values) ' Use List of Strings as IEnumerable. Dim valuesList As List(Of String) = New List(Of String) valuesList.Add("cat") DisplaySize(valuesList) End Sub Sub DisplaySize(ByVal col As IEnumerable(Of String)) ' Display count from interface. Console.WriteLine(col.Count()) End Sub End Module
3 1
Benchmark, interface. We test the speed of an Interface Function call versus a Class Function call. An Interface causes a small slowdown. Using a direct method call is faster.
Version 1 We call an Interface Function. It is specified by the IWidget Interface. We call it through an Interface reference.
Version 2 We call a normal Class Function. It is specified directly on the Widget class.
Result In a Release build, the program that uses an Interface reference to call GetName is slower. GetNameDirect is faster.
Interface IWidget Function GetName(ByVal size As Integer) As String End Interface Class Widget Implements IWidget Public Function GetName(size As Integer) As String Implements IWidget.GetName ' An interface method. If size = 0 Then Return "Zero" End If Return "Unknown" End Function Public Function GetNameDirect(size As Integer) As String ' A class method. If size = 0 Then Return "Zero" End If Return "Unknown" End Function End Class Module Module1 Sub Main() Dim widget As Widget = New Widget Dim widget2 As IWidget = widget Dim m As Integer = 100000000 ' Version 1: use Interface method. Dim s1 As Stopwatch = Stopwatch.StartNew For i As Integer = 0 To m - 1 widget2.GetName(i) Next s1.Stop() ' Version 2: use Class method. Dim s2 As Stopwatch = Stopwatch.StartNew For i As Integer = 0 To m - 1 widget.GetNameDirect(i) Next s2.Stop() Dim u As Integer = 1000000 Console.WriteLine(((s1.Elapsed.TotalMilliseconds * u) / m).ToString("0.00 ns")) Console.WriteLine(((s2.Elapsed.TotalMilliseconds * u) / m).ToString("0.00 ns")) End Sub End Module
3.82 ns, GetName (Interface Function) 0.95 ns, GetNameDirect (no Interface)
IComparable. With IComparable, we indicate how two objects of a type are ordered. We tell which one comes before the other. An Integer indicates the objects relative sizes.
Built-in. The .NET Framework includes many interfaces: it extensively uses them itself. Often developers use these interfaces more than custom ones.
More on abstraction. Interfaces introduce a level of abstraction. We implement an Interface in many Classes. And then we can use those classes through that Interface.
This streamlines program logic. We call the Interface functions. These in turn invoke the specialized functions from the Classes. With complexity we simplify.
Dot Net Perls is a collection of tested code examples. Pages are continually updated to stay current, with code correctness a top priority.
Sam Allen is passionate about computer languages. In the past, his work has been recommended by Apple and Microsoft and he has studied computers at a selective university in the United States.
This page was last updated on Dec 13, 2021 (edit link).
© 2007-2024 Sam Allen.