MyClass - Implementing Polymorphism in VB.Net
Learn how to take advantage of polymorphism in VB.Net with William's quick tutorial. Learn how polymorphism can eleviate your OOP-related headaches!
This article explains and extends the know-how of implementing polymorphism in VB.Net. Of course, polymorphism is a huge topic and I will only focus on the little known VB.Net keyword MyClass.
There was a recent tip published titled, "Polymorphism Can Lead to Head Scratching in VB.Net". It can be found here.
I would like to stress that VB.Net is a full compliant object-oriented language and thus, OOP should be practiced at all times within .NET Development, albeit with careful planning and design so as not to lose focus.
In the aforementioned article, the author stresses that polymorphism can lead to nightmares and headaches. I would like to stress that not implementing polymorphism can lead to much worse nightmares and headaches in terms of code maintenance and extensibility.
The above problem, as stated by the author, can essentially be solved with the VB.Net keyword: MyClass.
I will replicate the exact same code, as first published in the original tip, and I will place the keyword in the appropriate place.
Lets see some code below:
Class Parent
Public Overridable Sub p1()
Console.Write("Parent.p1")
End Sub
Public Sub p2()
MyClass.p1()
'Implementing keyword MyClass here tells all derived classes to refer to the base / abstract class wherein the keyword MyClass appears
End Sub
End Class
Class Child
Inherits Parent
Public Overrides Sub p1()
Console.Write("Child.p1")
MyBase.p2()
End Sub
End Class
Sub Main()
Dim p As Parent
Dim c As Child
p = New Parent()
p.p1() 'OK
p.p2() 'OK
p = New Child()
p.p1() 'stack overflow error is prevented
If MyClass is not implemented above in the base class, you will get a stack overflow error. So why does the stack overflow occur?
- Parent.p2() calls Parent.p1()
- Parent.p1() is polymorphic because it can be overridden
- Child.p1() overrides Parent.p1() so any calls to Parent.p1() will actually call Child.p1() if you have an instance of class Child
- Child.p1() calls MyBase.p2()
- MyBase.p2() is actually Parent.p2()
Now if you are still with me, the pitfall comes when you have an instance of class Child and call procedures p1 and p2. Calling p1 produces the following execution flow:
Child.p1 -> Parent.p2 -> Child.p1 -> Parent.p2 -> Child.p1 -> etc.
And the cycle repeats until we have no stack space left. Calling p2 produces the following execution flow:
Child.p2 -> Child.p1 -> Parent.p2 -> Child.p1 -> Parent.p2 -> Child.p1 -> etc.
Implementing the keyword MyClass in the base class tells all derived classes to use the method in the base class itself and, therefore, a stack overflow error is prevented.
p.p2() 'stack overflow error is prevented
c = New Child()
c.p1() 'stack overflow error is prevented
c.p2() 'stack overflow error is prevented
End Sub
I hope this will help VB.Net developers along the way to develop software the object-oriented way.
No comments:
Post a Comment