# OOP Keywords
# Defining a class
Classes are vital aspects of OOP. A class is like the "blueprint" of an object. An object has the properties of a class, but the characteristics are not defined within the class itself. As each object can be different, they define their own characteristics.
Public Class Person
End Class
Public Class Customer
End Class
A class can also contain subclasses. A subclass inherits the same properties and behaviors as its parent class, but can have its own unique properties and classes.
# Inheritance Modifiers (on classes)
# Inherits
Specifies the base (or parent) class
Public Class Person
End Class
Public Class Customer
Inherits Person
End Class
'One line notation
Public Class Student : Inherits Person
End Class
Possible objects:
Dim p As New Person
Dim c As New Customer
Dim s As New Student
# NotInheritable
Prevents programmers from using the class as a base class.
Public NotInheritable Class Person
End Class
Possible objects:
Dim p As New Person
# MustInherit
Specifies that the class is intended for use as a base class only. (Abstract class)
Public MustInherit Class Person
End Class
Public Class Customer
Inherits Person
End Class
Possible objects:
Dim c As New Customer
# Inheritance Modifiers (on properties and methods)
# Overridable
Allows a property or method in a class to be overridden in a derived class.
Public Class Person
Public Overridable Sub DoSomething()
Console.WriteLine("Person")
End Sub
End Class
# Overrides
Overrides an Overridable property or method defined in the base class.
Public Class Customer
Inherits Person
'Base Class must be Overridable
Public Overrides Sub DoSomething()
Console.WriteLine("Customer")
End Sub
End Class
# NotOverridable
Prevents a property or method from being overridden in an inheriting class. Default behaviour. Can only be declared on overrides methods
Public Class Person
Public Overridable Sub DoSomething()
Console.WriteLine("Person")
End Sub
End Class
Public Class Customer
Inherits Person
Public NotOverridable Overrides Sub DoSomething()
Console.WriteLine("Customer")
End Sub
End Class
Public Class DetailedCustomer
Inherits Customer
'DoSomething can't be overridden
End Class
Example Usage:
Dim p As New Person
p.DoSomething()
Dim c As New Customer
c.DoSomething()
Dim d As New DetailedCustomer
d.DoSomething()
Output:
Person
Customer
Customer
# MustOverride
Requires that a derived class override the property or method.
MustOverride methods must be declared in MustInherit classes.
Public MustInherit Class Person
Public MustOverride Sub DoSomething()
'No method definition here
End Class
Public Class Customer
Inherits Person
'DoSomething must be overridden
Public Overrides Sub DoSomething()
Console.WriteLine("Customer")
End Sub
End Class
Example Usage:
Dim c As New Customer
c.DoSomething()
Output:
Customer
# MyBase
The MyBase keyword behaves like an object variable that refers to the base class of the current instance of a class.
Public Class Person
Public Sub DoSomething()
Console.WriteLine("Person")
End Sub
End Class
Public Class Customer
Inherits Person
Public Sub DoSomethingElse()
MyBase.DoSomething()
End Sub
End Class
Usage example:
Dim p As New Person
p.DoSomething()
Console.WriteLine("----")
Dim c As New Customer
c.DoSomething()
c.DoSomethingElse()
Output:
Person
----
Person
Person
# Me vs MyClass
Me uses the current object instance.
MyClass uses the memberdefinition in the class where the member is called
Class Person
Public Overridable Sub DoSomething()
Console.WriteLine("Person")
End Sub
Public Sub useMe()
Me.DoSomething()
End Sub
Public Sub useMyClass()
MyClass.DoSomething()
End Sub
End Class
Class Customer
Inherits Person
Public Overrides Sub DoSomething()
Console.WriteLine("Customer")
End Sub
End Class
Example Usage:
Dim c As New Customer
c.useMe()
c.useMyClass()
Output:
Customer
Person
# Overloading
Overloading is the creation of more than one procedure, instance constructor, or property in a class with the same name but different argument types.
Class Person
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Overloads Sub Display(ByVal theDouble As Double)
' Add code that displays Double data.
End Sub
End Class
# Shadows
It redeclares a member that is not overridable. Only calls to the instance will be affected. Code inside the base classes will not be affected by this.
Public Class Person
Public Sub DoSomething()
Console.WriteLine("Person")
End Sub
Public Sub UseMe()
Me.DoSomething()
End Sub
End Class
Public Class Customer
Inherits Person
Public Shadows Sub DoSomething()
Console.WriteLine("Customer")
End Sub
End Class
Example usage:
Dim p As New Person
Dim c As New Customer
p.UseMe()
c.UseMe()
Console.WriteLine("----")
p.DoSomething()
c.DoSomething()
Output:
Person
Person
----
Person
Customer
Pitfalls:
Example1, Creating a new object through a generic. Which function will be used??
Public Sub CreateAndDoSomething(Of T As {Person, New})()
Dim obj As New T
obj.DoSomething()
End Sub
example usage:
Dim p As New Person
p.DoSomething()
Dim s As New Student
s.DoSomething()
Console.WriteLine("----")
CreateAndDoSomething(Of Person)()
CreateAndDoSomething(Of Student)()
Output: By intuition the result should be the same. Yet that is not true.
Person
Student
----
Person
Person
Example 2:
Dim p As Person
Dim s As New Student
p = s
p.DoSomething()
s.DoSomething()
Output: By intuition you could think that p and s are equal and will behave equal. Yet that is not true.
Person
Student
In this simple examples it is easy to learn the strange behaviour of Shadows. But in real-life it brings a lot of surprises. It is advisably to prevent the usage of shadows. One should use other alternatives as much as possible (overrides etc..)
# Interfaces
Public Interface IPerson
Sub DoSomething()
End Interface
Public Class Customer
Implements IPerson
Public Sub DoSomething() Implements IPerson.DoSomething
Console.WriteLine("Customer")
End Sub
End Class