| xHarbour Reference Documentation > Statement Reference |
![]() |
![]() |
![]() |
Declares the implementation code of a method.
METHOD <MethodName>[( <params,...> )] CLASS <ClassName> <...program code...> RETURN <retVal>
When the METHOD statement occurs outside the class declaration after ENDCLASS, it declares the implementation part of a method. A method is implemented like a FUNCTION, including formal parameter list, if required.
There is one important difference to functions: a special variable self exists in all methods. self is the object executing the method. Via self instance variables of an object can be accessed and other methods of the class can be invoked.
The name of the class where the method is declared must be specified with the method implementation. Without the class name, it would not be possible to implement multiple classes having the same method names in one PRG module.
When a method does not require a particular return value, it is quite common to return the self object. This way, method calls can be "chained" in one line of code.
| See also: | CLASS, FUNCTION, INLINE METHOD, METHOD (declaration), PROCEDURE |
| Category: | Class declaration , Declaration , xHarbour extensions |
| Header: | hbclass.ch |
| Source: | vm\classes.c |
| LIB: | xhb.lib |
| DLL: | xhbdll.dll |
// The example implements a class with nine methods that can be
// used for database access which is independent of the current
// workarea.
#include "HbClass.ch"
PROCEDURE Main
LOCAL oWorkArea
// method "chaining"
oWorkArea := WorkArea():new( "Customer.dbf" ):open()
? Alias() // result: Customer
SELECT 0
? Alias() // result: empty string ("")
// method "chaining"
oWorkArea:goBottom():skip(-5)
DO WHILE .NOT. oWorkArea:eof()
? Customer->LastName
oWorkArea:skip()
ENDDO
oWorkArea:close()
? Alias() // result: empty string ("")
oWorkArea:open()
? Alias() // result: Customer
oWorkArea:close()
RETURN
CLASS WorkArea
PROTECTED:
VAR fileName
EXPORTED:
VAR area READONLY
METHOD init
METHOD open
METHOD close
METHOD bof
METHOD eof
METHOD found
METHOD skip
METHOD goTop
METHOD goBottom
ENDCLASS
METHOD init( cFileName ) CLASS WorkArea
::fileName := cFileName
::area := 0
RETURN self
METHOD open() CLASS WorkArea
IF ::area == 0
USE ( ::fileName ) NEW SHARED
::area := Select()
ELSE
DbSelectArea( ::area )
ENDIF
RETURN self
METHOD close() CLASS WorkArea
IF ::area <> 0
(::area)->(DbCloseArea())
::area := 0
ENDIF
RETURN self
METHOD bof CLASS WorkArea
RETURN IIf( ::area == 0, .T., (::area)->(Bof()) )
METHOD eof CLASS WorkArea
RETURN IIf( ::area == 0, .T., (::area)->(Eof()) )
METHOD found CLASS WorkArea
RETURN IIf( ::area == 0, .F., (::area)->(Found()) )
METHOD skip( nSkip ) CLASS WorkArea
IF PCount() == 0
nSkip := 1
ENDIF
IF ::area > 0
(::area)->(DbSkip(nSkip))
ENDIF
RETURN self
METHOD goTop CLASS WorkArea
IF ::area > 0
(::area)->(DbGotop())
ENDIF
RETURN self
METHOD goBottom CLASS WorkArea
IF ::area > 0
(::area)->(DbGoBottom())
ENDIF
RETURN self
http://www.xHarbour.com