'Shadows' vs. 'Overrides' in VB.NET
What is the significance of the two keywords Shadows and Overrides? What they do and for which context is one or the other preferable?
Solution 1:
Overrides is the more normal qualifier. If the child class redefines a base class function in this way, then regardless of how a child object is referenced (using either a base class or a child class reference) it is the child function that is called.
On the other hand, if the child class function Shadows the base class function, then a child object accessed via a base class reference will use that base class function, despite being a child object.
The child function definition is only used if the child object is accessed using a matching child reference.
Solution 2:
Shadowing probably doesn't do what you think it does.
Consider the following classes:
Public MustInherit Class A
Public Function fX() As Integer
Return 0
End Function
End Class
Public Class B
Inherits A
Public Shadows Function fX() As Integer
Return 1
End Function
End Class
Now I use them:
Dim oA As A
Dim oB As New B
oA = oB
You probably think oA and oB are the same right?
Nope.
oA.fx = 0 while oB.fx = 1
Imho this is very dangerous behavior and it's barely mentioned in the docs.
If you had used override they would be the same.
So while there are legitimate uses for shadows, chances are whatever you're doing is not one of them and it should be avoided.
Solution 3:
Overrides - Extending or creating alternate functionality for a method.
Example: Add or extended the functionality of the Paint event of a window.
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e) ' retain the base class functionality
'add code for extended functionality here
End Sub
Shadows - Redefines an inherited method and forces its use for all classes instanced with that type. In other words the method is not overloaded but redefined and the base class methods are not available, thus forcing the use of the function declared in the class. Shadows preserves or retains the definition of the method such that it is not destroyed if the base class methods are modified.
Example: Force all "B" classes to use it's oddball Add definition such that if A class Add methods are modified it won't affect B's add. (Hides all base class "Add" methods. Won't be able to call A.Add(x, y, z) from an instance of B.)
Public Class A
Public Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
Return x + y
End Function
Public Function Add(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) As Integer
Return x + y + z
End Function
End Class
Public Class B
Inherits A
Public Shadows Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
Return x - y
End Function
End Class