Version 10 (modified by hopscc, 15 years ago) |
---|
Class Definitions
Classes are declared using the class keyword followed by the classname.
The class may have any of the usual access modifiers.
The Superclass inheritance and Interface conformance are indicated with the inherits and implements keywords.
Class Grammar
class <ClassName> [is <AccessModifiers>] [has <Attributes>] [where <GenericParam> must be <GenericConstraints>] [inherits <BaseClassName> ] [implements <InterfaceName> [, <InterfaceName>]...] [<DocString>] [ [<Variables>] [<Properties>] [<Methods> [<ClassEnums>] [<Sigs>] [<Invariants>] [<Tests>] [<SharedClause>] ]...
Interfaces
Interfaces are declared in much the same way except the keyword is interface and method and property bodies are not defined.
Interface hierarchies (SuperInterfaces) can also be specified using inherits
Interface Grammar
interface <InterfaceName> [is <AccessModifiers>] [has <Attributes>] [where <GenericParam> must be <GenericConstraints>] [inherits <BaseInterfaceName> [, <BaseInterfaceName>]... ] [<DocString>] [ [<Properties>] [<Methods> [<ClassEnums>] [<Sigs>] [<Invariants>] [<SharedClause>] ]...
Instance and Class Variables
Instance and Class variables are declared within the class using keyword var.
Instance and Class variable definition Grammar
var <variableName> [as <Type>] [= <initialValue>] [is <AccessModifiers> [has <Attributes>] ] [<DocString>] var <variableName> [as <Type>] [= <initialValue>] [is <AccessModifiers>] [has <Attributes>] [<DocString>]
e.g.
var x as String var _y as int var _ya as int = 47 var z as int is private var t as int = 99 is protected, shared """ Temporary backup value """
All Class and Instance variable names must start with a lowerCase Letter
If the name is prefixed with an _ (single underscore) its accessType defaults to protected and it is directly accessible from within the class method code.
If the name is prefixed with an _ _ (double underscore) its accessType defaults to private and it is directly accessible from within the class method code.
Without that prefix on the name the variables accessType is public (by default) and
it must be accessed from within method code by prefixing the name with either this. or just . .
In either case the default access ? setting can be adjusted with an access modifier clause.
Class (or static) variables are specified with the access modifier shared as in is shared e.g.
var _x = 100 # default protected def tryx( opnd as int) as int return _x + opnd var __x = 200 # default private def tryPrivx( opnd as int) as int return __x + opnd var y is protected # default public, explicit access modifier overrides setting to protected def tryy( opnd as int) as int return .y + opnd var statX as int = 45 is shared def x print .statX
Properties
Define a property for the class
Properties Grammar
get <propName> [ as {<Type>, var}] [is <accessModifier>] set <propName> [ as {<Type>, var} [is <accessModifier>] pro <propName> [ as {<Type>, var}] [is <accessModifier>] pro <propName> [is <accessModifier>] get [...] return <value> set [...] # assign or otherwise do something with implicit arg "value" (passed in) to something
Methods
Methods are defined using the keyword def.
If not specified the returnType is void ( i.e nothing returned) and the access modifiers are public, virtual
Like variables if the name is prefixed with an _ its access modifier defaults to protected, virtual and it is directly accessible from within the class method code.
If the name is prefixed with an _ _ (double underscore) its access modifier defaults to private',virtual' and it is directly accessible from within the class method code.
Without those prefixes on the name of the methods the accessType is public, virtual and
it must be accessed from within method code by prefixing the name with either this. or just . .
Method Grammar
def <methodName> [as <returnType>] [is <AccessModifiers>] [has <Attributes>] [<DocString>] def <methodName>(<paramList>) [as <returnType>] [is <AccessModifiers>] [has <Attributes>] [<DocString>]
The initializer or constructor method of a class is a special method called init which is implicitly called when a class instance is constructed. Its responsible for setting the contents of a class instance to an initial state. It doesnt return any value and is not inherited (i.e baseclass initialization must be done with an explicit call to a baseclass constructor).
If an init method is not specified the compiler runtime generates a noArg constructor that does nothing.
Constructor chaining can be done to another constructor in the same class (usually with a different number or Type of args) or to a Superclass constructor (using base.init) - this call must be the first executable line in the init method.
Method Parameter List
A parameter list is a comma separated list of name (and optionally type and parameter description modifier) specifications
<paramName> [as [<paramDesc>] <Type>] [, ...]
<paramDesc> is optional and may be vari and/or a parameter direction indicator out or inout ( default if unspecified is in)
vari indicates the parameter name is a placeholder for a variable length arglist. Within the method this may be unpacked/accessed as a list.
in (implicit) Args are only passed into the method. Any changes made to the argument inside the method are not visible outside the method (pass-by-value)
out the arg is returned from the method
inout argument is both passed into the method and (any possibly changed) value is also returned from the method (pass-by-reference)
If <Type> is unspecified it is treated as dynamic?
e.g.
def meth( a, b is String, c is out String) c = b + "_meth" def sum(a as vari int) as int sum = 0 for i in a sum += i return sum
meth takes 3 args , the first and second are inward only and are dynamic and a string respectively, the third is only returned from the method as a string sum takes a variable number of integer args
Generics
+++TBD+++ Generics
++accessing baseclass methods
Example
#Interfaces interface Audible def makesNoise as String interface Mateable pro mateName as String interface Breedable inherits Mateable pro childName as String # class declaration - note indentation class Bovidae def diet as String return 'Herbivorous Cud Chewing' def numHooves as int return 4 class Sheep is public, nonvirtual # public is default anyway inherits Bovidae # Superclass implements Audible, Breedable var _lifeSpan as int = 8 is shared # years average # or var lifeSpan as int private shared var _age as int =1 var liveWeight as int is private var _isAlive as bool #shared #_lifespan = 8 def init _age = 1 .liveWeight = 2 _isAlive = true def makesNoise as String return 'Baaaaa' pro mateName as String get return 'Ram' set pass pro childName as String get return 'lamb' set pass def age(byNYears as int) _age += byNYears if _age > _lifeSpan _isAlive = false def gainWgt(wgt as int) .liveWeight += wgt def toString as String is new return 'Sheep:age=[_age], weight=[.liveWeight], living=[_isAlive]' def main is shared s = Sheep() print 's=[s]' s.age(1)