Extends declares
typename to be derived from
base_typename. The derived user-defined type,
typename, inherits fields and methods of the
base_typename base type.
typename objects may be used in place of
base_typename objects. Fields and methods inherited from
base_typename will be implicitly accessible like members of
typename.
However, a member will shadow an inherited member if they have the same identifier. The
Base (Member Access) keyword can be used to explicitly access members of the base type shadowed by local members.
User-defined types that extend another type will include the base type structure at their beginning, and their size as reported by
Sizeof() is the sum of their base type's size plus the size needed for any regular data fields (non-static data fields). Since the inherited members make sure that the structure is not empty, a derived type is not required to have regular data fields of its own.
In
typename (the derived user-defined type), the fields can share the same memory space than the
base_typename only if
typename is a
Union. Here it does not matter whether
base_typename is a
Union or not.
If only
base_typename is a
Union, then it will not be affected by fields from
typename (the derived user-defined type).
As a
Union is not allowed to have complex fields (i.e. user-defined types with constructor/destructor, or dynamic strings), a derived
Union cannot be allowed to have (contain) a complex
base_typename.
The
Base (Initializer) keyword can be used at the top of constructor of derived user-defined type. It allows to specify an initializer or constructor call for the base type.
Extending the built-in
Object type allows a user-defined type to be used with
Operator Is to perform run-time type checks, to support
Virtual and
Abstract methods, and to use the
Override method attribute.
Note: UDT pointer can only be cast to pointer types of "widened compatibility" (up or even down in the inheritance hierarchy), or to
Any Ptr. Otherwise, cast to
Any Ptr first (or to
Object Ptr first if both types are directly or indirectly derived from
Object).
Type SchoolMember 'Represents any school member'
Declare Constructor ()
Declare Sub Init (ByRef _name As String, ByVal _age As Integer)
As String Name
As Integer age
End Type
Constructor SchoolMember ()
Print "Initialized SchoolMember"
End Constructor
Sub SchoolMember.Init (ByRef _name As String, ByVal _age As Integer)
This.name = _name
This.age = _age
Print "Name: "; This.name; " Age:"; This.age
End Sub
Type Teacher Extends SchoolMember 'Represents a teacher derived from SchoolMember'
Declare Constructor (ByRef _name As String, ByVal _age As Integer, ByVal _salary As Integer)
As Integer salary
Declare Sub Tell ()
End Type
Constructor Teacher (ByRef _name As String, ByVal _age As Integer, ByVal _salary As Integer)
Print "Initialized Teacher"
This.Init(_name, _age) 'implicit access to base member procedure'
This.salary = _salary
End Constructor
Sub Teacher.Tell ()
Print "Salary:"; This.salary
End Sub
Type Student Extends SchoolMember 'Represents a student derived from SchoolMember'
Declare Constructor (ByRef _name As String, ByVal _age As Integer, ByVal _marks As Integer)
As Integer marks
Declare Sub Tell ()
End Type
Constructor Student (ByRef _name As String, ByVal _age As Integer, ByVal _marks As Integer)
Print "Initialized Student"
This.Init(_name, _age) 'implicit access to base member procedure'
This.marks = _marks
End Constructor
Sub Student.Tell ()
Print "Marks:"; This.marks
End Sub
Dim As Teacher t = Teacher("Mrs. Shrividya", 40, 30000)
t.Tell()
Print
Dim As Student s = Student("Swaroop", 22, 75)
s.Tell()
' Example using all eight keywords of inheritance:
' 'Extends', 'Base.', 'Base()', 'Object', 'Is' operator, 'Virtual', 'Abstract', 'Override'
Type root Extends Object ' 'Extends' to activate RTTI by inheritance of predefined Object type
Declare Function ObjectHierarchy () As String
Declare Abstract Function ObjectRealType () As String ' 'Abstract' declares function without local body
' which must be overriden
Dim Name As String
Declare Virtual Destructor () ' 'Virtual' declares destructor with body ('Abstract' forbidden)
Protected:
Declare Constructor () ' to avoid user construction from root
Declare Constructor (ByRef rhs As root) '' to avoid user copy-construction from root
End Type ' derived type may be member data empty
Constructor root ()
End Constructor
Function root.ObjectHierarchy () As String
Return "Object(forRTTI) <- root"
End Function
Virtual Destructor root ()
Print "root destructor"
End Destructor
Type animal Extends root ' 'Extends' to inherit of root
Declare Constructor (ByRef _name As String = "")
Declare Function ObjectHierarchy () As String
Declare Virtual Function ObjectRealType () As String Override ' 'Virtual' declares function with local
' body which can be overriden
' 'Override' to check if the function is
' well an override
Declare Virtual Destructor () Override ' 'Virtual' declares destructor with local body
' 'Override' to check if the destructor is well an override
End Type
Constructor animal (ByRef _name As String = "")
This.name = _name
End Constructor
Function animal.ObjectHierarchy () As String
Return Base.ObjectHierarchy & " <- animal" ' 'Base.' allows to access to parent member function
End Function
Virtual Function animal.ObjectRealType () As String
Return "animal"
End Function
Virtual Destructor animal ()
Print " animal destructor: " & This.name
End Destructor
Type dog Extends animal ' 'Extends' to inherit of animal
Declare Constructor (ByRef _name As String = "")
Declare Function ObjectHierarchy () As String
Declare Function ObjectRealType () As String Override ' 'Override' to check if the function is well an
' override
Declare Destructor () Override ' 'Override' to check if the destructor is well an override
End Type ' derived type may be member data empty
Constructor dog (ByRef _name As String = "")
Base(_name) ' 'Base()' allows to call parent constructor
End Constructor
Function dog.ObjectHierarchy () As String
Return Base.ObjectHierarchy & " <- dog" ' 'Base.' allows to access to parent member function
End Function
Function dog.ObjectRealType () As String
Return "dog"
End Function
Destructor dog ()
Print " dog destructor: " & This.name
End Destructor
Type cat Extends animal ' 'Extends' to inherit of animal
Declare Constructor (ByRef _name As String = "")
Declare Function ObjectHierarchy () As String
Declare Function ObjectRealType () As String Override ' 'Override' to check if the function is well an
' override
Declare Destructor () Override ' 'Override' to check if the destructor is well an override
End Type ' derived type may be member data empty
Constructor cat (ByRef _name As String = "")
Base(_name) ' 'Base()' allows to call parent constructor
End Constructor
Function cat.ObjectHierarchy () As String
Return Base.ObjectHierarchy & " <- cat" ' 'Base.' allows to access to parent member function
End Function
Function cat.ObjectRealType () As String
Return "cat"
End Function
Destructor cat ()
Print " cat destructor: " & This.name
End Destructor
Sub PrintInfo (ByVal p As root Ptr) ' must be put after definition of animal type, dog type and cat type
Print " " & p->Name, " " & p->ObjectRealType, " ";
If *p Is dog Then ' 'Is' allows to check compatibility with type symbol
Print Cast(dog Ptr, p)->ObjectHierarchy
ElseIf *p Is cat Then ' 'Is' allows to check compatibility with type symbol
Print Cast(cat Ptr, p)->ObjectHierarchy
ElseIf *p Is animal Then ' 'Is' allows to check compatibility with type symbol
Print Cast(animal Ptr, p)->ObjectHierarchy
End If
End Sub
Print "Name:", "Object (real): Hierarchy:"
Dim a As root Ptr = New animal("Mouse")
PrintInfo(a)
Dim d As root Ptr = New dog("Buddy")
PrintInfo(d)
Dim c As root Ptr = New cat("Tiger")
Printinfo(c)
Print
Delete a
Delete d
Delete c