Thursday, June 5, 2014

When and Why we need Interfaces in our Project? VB.Net

Today I will show you when and why we need to implement Interfaces. This is not something that you have to have in your project. There are some scenarios where you have to use Interfaces. I will give you two very simple but effective examples, which will give you a clear idea, when to use Interfaces in your project.

Before I give you basic scenarios, let me prepare the first platform. Here are 5 child classes and one parent class.

Public MustInherit Class Animal
    Public Property Legs As Integer
End Class
Public Class Cow
    Inherits Animal

    Public Property AverageMilkQuantity As Integer
 
End Class
Public Class Buffalo
    Inherits Animal

    Public Property AverageMilkQuantity As Integer

End Class
Public Class Camel
    Inherits Animal

    Public Property AverageMilkQuantity As Integer

End Class
Public Class Lion
    Inherits Animal

    Public Property MeatEatingQuantity As Integer

End Class
Public Class Tiger
    Inherits Animal

    Public Property MeatEatingQuantity As Integer

End Class

In above code, you can see parent class as “Animal” and 5 child classes which are inheriting parent class. Not all animals have the same properties. Some animals sub classes have different properties. For example, Dairy milk producer animals have different properties than meat eater animals.

Now our platform is ready. I will show you two scenarios.

Scenario no. 1:

        Dim animals As New List(Of Animal)

        Dim oCow As New Cow
        oCow.Legs = 4
        oCow.AverageMilkQuantity = 15

        Dim oBuffalo As New Buffalo
        oBuffalo.Legs = 4
        oBuffalo.AverageMilkQuantity = 20

        Dim oCamel As New Camel
        oCamel.Legs = 4
        oCamel.AverageMilkQuantity = 25

        Dim oTiger As New Tiger
        oTiger.Legs = 4
        oTiger.MeatEatingQuantity = 5

        Dim oLion As New Lion
        oLion.Legs = 4
        oLion.MeatEatingQuantity = 7

        animals.Add(oCow)
        animals.Add(oBuffalo)
        animals.Add(oCamel)
        animals.Add(oTiger)
        animals.Add(oLion)

        'For Milk Producer '
        For Each oAnimal As Animal In animals
            Dim MilkQuantity As Integer = 0 

            If TypeOf oAnimal Is Cow Then
                MilkQuantity = DirectCast(oAnimal, Cow).AverageMilkQuantity
                
            ElseIf TypeOf oAnimal Is Buffalo Then
                MilkQuantity = DirectCast(oAnimal, Buffalo).AverageMilkQuantity
                
            ElseIf TypeOf oAnimal Is Camel Then
                MilkQuantity = DirectCast(oAnimal, Camel).AverageMilkQuantity
                
            End If

        Next

In this code, you can see in the last “For each” loop, we have to repeat the same stuff again and again unnecessarily. To solve this problem, we will create an Interface. We can create an abstract class, but it is unnecessary because we are not going to write any kind of implementation code. So the best solution is to create an Interface. Here is the Interface, changed child classes and changed “For each” loop.

Public Interface IMilkProducer
    Property AverageMilkQuantity As Integer
End Interface
Public Class Cow
    Inherits Animal
    Implements IMilkProducer
     
    Public Property AverageMilkQuantity As Integer Implements IMilkProducer.AverageMilkQuantity
     
End Class
Public Class Buffalo
    Inherits Animal
    Implements IMilkProducer
     
    Public Property AverageMilkQuantity As Integer Implements IMilkProducer.AverageMilkQuantity
     
End Class
Public Class Camel
    Inherits Animal
    Implements IMilkProducer
     
    Public Property AverageMilkQuantity As Integer Implements IMilkProducer.AverageMilkQuantity
     
End Class
 'For Milk Producer '
For Each oAnimal As Animal In animals
     Dim MilkQuantity As Integer = 0
     
     If TypeOf oAnimal Is IMilkProducer Then
         MilkQuantity = DirectCast(oAnimal, IMilkProducer).AverageMilkQuantity
     End If

Next


Isn’t it great? It reduced number of code lines of "For each" loop and makes the code easy to use and maintainable. Interfaces are like “plug and play” instrument. You can create interfaces with closely related properties or methods. Classes have to implement those interfaces to make code easy to use and maintainable.

Scenario no. 2:

Now imagine that you want to manipulate some methods of particular group like “MilkProducer”. When somebody request “getMilkQuantity”, you want to put some logic and then you want to return “MilkQuantity”. How will you do that? Here is the simple code, which will solve this issue.

Public Class MilkProducer
    Dim objMP As IMilkProducer

    Sub New(ByVal oMilkProducer As IMilkProducer)
        objMP = oMilkProducer
    End Sub

    Public Function getMilkQuantity() As Integer

        'Her You can manipulate '
        If TypeOf objMP Is Cow Then
            'This is just an example '
            objMP.AverageMilkQuantity = 10
        End If

        Return objMP.AverageMilkQuantity

    End Function
End Class
'For Milk Producer '
 For Each oAnimal As Animal In animals
     Dim MilkQuantity As Integer = 0
     
     If TypeOf oAnimal Is IMilkProducer Then
          Dim mp As New MilkProducer(oAnimal)

          MilkQuantity = mp.getMilkQuantity
          
     End If

Next


Isn’t it cool? Let me know if you have any questions. I will try my best to provide answers to your queries. I hope this will help you understand when and why we need to create Intefaces.

No comments:

Post a Comment

React-select is very slow on larger list - Found solution - using react-window

 I had more than 4000 items in searchable dropdownlist. I have used react-select but it was very slow. finally I found complete solution to ...