Wiki source for KeyPgBase


Show raw source

{{fbdoc item="title" value="BASE (member access)"}}----
Provides explicit access to base type members in non-static methods of a ##[[KeyPgType|Type]]##

{{fbdoc item="syntax"}}##
**base**.//member//
**base** [ .**base** ... ] .//member//
##
{{fbdoc item="desc"}}
##**Base**## provides a way to explicitly access members of a specific base type, in the context of non-static methods of a user-defined type derived from another type using ##[[KeyPgExtends|Extends]]##.

By using ##**Base**## repeatedly, as in ##base.base.base.member##, it is possible to access any desired base type, in case there are multiple levels of inheritance.

##**Base**## is especially useful when a base type's member is shadowed by a local variable or member of a derived type using the same identifier. ##**Base**## then allows unambiguous access to the base type.

For virtual methods, base.method() always calls the base method and never the overriding method.

**Note:** There is no specific syntax with ##**Base**## to access a member operator of a specific base type. The only way is to apply the operator on the instance beforehand up-casted to the right type (but for virtual operators, this workaround does not allow to call the base operator when overridden, because that does not modify the run-time type of the instance but only its compile-time type).

{{fbdoc item="ex"}}
{{fbdoc item="filename" value="examples/manual/udt/base.bas"}}%%(freebasic)
Type Parent
As Integer a
Declare Constructor(ByVal As Integer = 0)
Declare Sub show()
End Type

Constructor Parent(ByVal a As Integer = 0)
This.a = a
End Constructor

Sub Parent.show()
Print "parent", a
End Sub

Type Child extends Parent
As Integer a
Declare Constructor(ByVal As Integer = 0)
Declare Sub show()
End Type

Constructor Child(ByVal a As Integer = 0)
'' Call base type's constructor
Base(a * 3)
This.a = a
End Constructor

Sub Child.show()
'' Call base type's show() method, not ours
Base.show()

'' Show both a fields, the base type's and ours'
Print "child", Base.a, a
End Sub

Type GrandChild extends Child
As Integer a
Declare Constructor(ByVal As Integer = 0)
Declare Sub show()
End Type

Constructor GrandChild(ByVal a As Integer = 0)
'' Call base type's constructor
Base(a * 2)
This.a = a
End Constructor

Sub GrandChild.show()
'' Call base type's show() method, not ours
Base.show()

'' Show both a fields, the base.base type's, the base type's and ours'
Print "grandchild", Base.Base.a, Base.a, a
End Sub

Dim As GrandChild x = GrandChild(3)
x.show()
%%
{{fbdoc item="lang"}}
- Methods are only supported in the //[[CompilerOptlang|-lang fb]]// dialect, hence ##**Base**## has no function in other dialects.

{{fbdoc item="diff"}}
- New to ""FreeBASIC""

{{fbdoc item="see"}}
- ##[[KeyPgBaseInit|Base (initializer)]]##
- ##[[KeyPgThis|This]]##
- ##[[KeyPgType|Type]]##
- ##[[KeyPgExtends|Extends]]##
- ##[[KeyPgExtendsZstring|Extends Zstring]]##
- ##[[KeyPgExtendsWstring|Extends Wstring]]##
- ##[[KeyPgOptionbase|Option Base]]##

{{fbdoc item="back" value="CatPgUserDefTypes|User Defined Types"}}
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki



sf.net phatcode