ScriptBasic > Tutorials

ScriptBasic OOP

(1/3) > >>

Support:
Here is an example how you can use OOP (Object-oriented Programming) with ScriptBasic. I plan to show other aspects of OOP style programming as time permits.

Comments and suggestions welcome !


--- Code: ---' ScriptBasic OOP Example

MODULE Customer

instance = 0

' Default property settings
_name[0] = ""
_addr1[0] = ""
_addr2[0] = ""

property{"name"} = _name[0]
property{"addr1"} = _addr1[0]
property{"addr2"} = _addr2[0]

FUNCTION GetName(object)
  GetName = property{"name"}[object]
END FUNCTION

FUNCTION SetName(object,value)
  property{"name"}[object] = value
END FUNCTION

FUNCTION GetAddr1(object)
  GetAddr1 = property{"addr1"}[object]
END FUNCTION

FUNCTION SetAddr1(object,value)
  property{"addr1"}[object] = value
END FUNCTION

FUNCTION GetAddr2(object)
  GetAddr2 = property{"addr2"}[object]
END FUNCTION

FUNCTION SetAddr2(object,value)
  property{"addr2"}[object] = value
END FUNCTION

FUNCTION New
  instance += 1
  _name[instance] = _name[0]
  _addr1[instance] = _addr1[0]
  _addr2[instance] = _addr2[0]
  new = instance
END FUNCTION

FUNCTION Destroy(object)
  _name[object] = undef
  _addr1[object] = undef
  _addr2[object] = undef
END FUNCTION

END MODULE

'
' MAIN
'
mycust = customer::New()

customer::SetName(mycust,"John Doe")
customer::SetAddr1(mycust,"123 Main St.")
customer::SetAddr2(mycust,"Anytown, USA")

PRINT customer::GetName(mycust),"\n"
PRINT customer::GetAddr1(mycust),"\n"
PRINT customer::GetAddr2(mycust),"\n"

customer::Destroy(mycust)

--- End code ---

C:\scriptbasic\test>custobj
John Doe
123 Main St.
Anytown, USA

C:\scriptbasic\test>

Support:
I added constants for the property names so I didn't have to use quoted strings for the names of the associative array property elements. It seems SB doesn't like name as a constant so I changed it to cname.


--- Code: ---' ScriptBasic OOP Example

MODULE Customer

CONST cname = "cname"
CONST addr1 = "addr1"
CONST addr2 = "addr2"

instance = 0

' Default property settings
_cname[0] = ""
_addr1[0] = ""
_addr2[0] = ""

property{cname} = _cname[0]
property{addr1} = _addr1[0]
property{addr2} = _addr2[0]

FUNCTION GetName(object)
  GetName = property{cname}[object]
END FUNCTION

FUNCTION SetName(object,value)
  property{cname}[object] = value
END FUNCTION

FUNCTION GetAddr1(object)
  GetAddr1 = property{addr1}[object]
END FUNCTION

FUNCTION SetAddr1(object,value)
  property{addr1}[object] = value
END FUNCTION

FUNCTION GetAddr2(object)
  GetAddr2 = property{addr2}[object]
END FUNCTION

FUNCTION SetAddr2(object,value)
  property{addr2}[object] = value
END FUNCTION

FUNCTION New
  instance += 1
  _cname[instance] = _cname[0]
  _addr1[instance] = _addr1[0]
  _addr2[instance] = _addr2[0]
  new = instance
END FUNCTION

FUNCTION Destroy(object)
  _cname[object] = undef
  _addr1[object] = undef
  _addr2[object] = undef
END FUNCTION

END MODULE

'
' MAIN
'
mycust = customer::New()

customer::SetName(mycust,"John Doe")
customer::SetAddr1(mycust,"123 Main St.")
customer::SetAddr2(mycust,"Anytown, USA")

PRINT customer::GetName(mycust),"\n"
PRINT customer::GetAddr1(mycust),"\n"
PRINT customer::GetAddr2(mycust),"\n"

customer::Destroy(mycust)

--- End code ---

Support:
Here is a shot at adding Polymorphism support to the first OOP example.


--- Quote ---Pointers to base class

One of the key features of derived classes is that a pointer to a derived class is type-compatible with a pointer to its base class. Polymorphism is the art of taking advantage of this simple but powerful and versatile feature, that brings Object Oriented Methodologies to its full potential.

--- End quote ---


--- Code: ---' ScriptBasic OOP Example

MODULE Customer

CONST cname = "cname"
CONST addr1 = "addr1"
CONST addr2 = "addr2"

instance = 0

' Default property settings
_cname[0] = ""
_addr1[0] = ""
_addr2[0] = ""

property{cname} = _cname[0]
property{addr1} = _addr1[0]
property{addr2} = _addr2[0]

FUNCTION GetName(object)
  GetName = property{cname}[object]
END FUNCTION

FUNCTION SetName(object,value)
  property{cname}[object] = value
END FUNCTION

FUNCTION GetAddr1(object)
  GetAddr1 = property{addr1}[object]
END FUNCTION

FUNCTION SetAddr1(object,value)
  property{addr1}[object] = value
END FUNCTION

FUNCTION GetAddr2(object)
  GetAddr2 = property{addr2}[object]
END FUNCTION

FUNCTION SetAddr2(object,value)
  property{addr2}[object] = value
END FUNCTION

FUNCTION New(base)
  instance += 1
  IF base = undef THEN
    _cname[instance] = _cname[0]
    _addr1[instance] = _addr1[0]
    _addr2[instance] = _addr2[0]
  ELSE
    REF property{cname}[instance] = property{cname}[base]
    REF property{addr1}[instance] = property{addr1}[base]
    REF property{addr2}[instance] = property{addr2}[base]
  END IF
  new = instance
END FUNCTION

FUNCTION Destroy(object)
  _cname[object] = undef
  _addr1[object] = undef
  _addr2[object] = undef
END FUNCTION

END MODULE

'
' MAIN
'
cust1 = customer::New()
customer::SetName(cust1,"John Doe")
customer::SetAddr1(cust1,"123 Main St.")
customer::SetAddr2(cust1,"Anytown, USA")

cust2 = customer::New(cust1)

PRINT customer::GetName(cust2),"\n"
PRINT customer::GetAddr1(cust2),"\n"
PRINT customer::GetAddr2(cust2),"\n"
PRINTNL

customer::SetName(cust2,"Mary Smith")

PRINT customer::GetName(cust1),"\n"

customer::Destroy(cust1)
customer::Destroy(cust2)

--- End code ---

C:\scriptbasic\test>custobj
John Doe
123 Main St.
Anytown, USA

Mary Smith

C:\scriptbasic\test>

Support:
I have added inheritance to the above example.


--- Code: ---' ScriptBasic OOP Example

MODULE Customer

CONST cname = "cname"
CONST addr1 = "addr1"
CONST addr2 = "addr2"

instance = 0

' Default property settings
_cname[0] = ""
_addr1[0] = ""
_addr2[0] = ""

property{cname} = _cname[0]
property{addr1} = _addr1[0]
property{addr2} = _addr2[0]

FUNCTION GetName(object)
  GetName = property{cname}[object]
END FUNCTION

FUNCTION SetName(object,value)
  property{cname}[object] = value
END FUNCTION

FUNCTION GetAddr1(object)
  GetAddr1 = property{addr1}[object]
END FUNCTION

FUNCTION SetAddr1(object,value)
  property{addr1}[object] = value
END FUNCTION

FUNCTION GetAddr2(object)
  GetAddr2 = property{addr2}[object]
END FUNCTION

FUNCTION SetAddr2(object,value)
  property{addr2}[object] = value
END FUNCTION

FUNCTION New(base)
  instance += 1
  IF base = undef THEN
    _cname[instance] = _cname[0]
    _addr1[instance] = _addr1[0]
    _addr2[instance] = _addr2[0]
  ELSE
    REF property{cname}[instance] = property{cname}[base]
    REF property{addr1}[instance] = property{addr1}[base]
    REF property{addr2}[instance] = property{addr2}[base]
  END IF
  new = instance
END FUNCTION

FUNCTION Inherit(base)
  instance += 1
  property{cname}[instance] = property{cname}[base]
  property{addr1}[instance] = property{addr1}[base]
  property{addr2}[instance] = property{addr2}[base]
  Inherit = instance
END FUNCTION 

FUNCTION Destroy(object)
  _cname[object] = undef
  _addr1[object] = undef
  _addr2[object] = undef
END FUNCTION

END MODULE

'
' MAIN
'
cust1 = customer::New()
customer::SetName(cust1,"John Doe")
customer::SetAddr1(cust1,"123 Main St.")
customer::SetAddr2(cust1,"Anytown, USA")

cust2 = customer::Inherit(cust1)

PRINT customer::GetName(cust2),"\n"
PRINT customer::GetAddr1(cust2),"\n"
PRINT customer::GetAddr2(cust2),"\n"
PRINTNL

customer::SetName(cust2,"Mary Smith")

PRINT customer::GetName(cust1),"\n"
PRINT customer::GetName(cust2),"\n"

customer::Destroy(cust1)
customer::Destroy(cust2)

--- End code ---

C:\scriptbasic\test>custobj
John Doe
123 Main St.
Anytown, USA

John Doe
Mary Smith

C:\scriptbasic\test>

Support:
The property list returns the property names and default values for the class.

Note: Functions GetName and SetName have been changed to GetCName and SetCName to match the property values. This change will be reflected in the examples moving forward.



--- Code: ---' ScriptBasic OOP Example

MODULE Customer

CONST cname = "cname"
CONST addr1 = "addr1"
CONST addr2 = "addr2"

instance = 0

' Default property settings
_cname[0] = "<enter name>"
_addr1[0] = "<enter address 1>"
_addr2[0] = "<enter address 2>"

property{cname} = _cname[0]
property{addr1} = _addr1[0]
property{addr2} = _addr2[0]

FUNCTION GetCName(object)
  GetCName = property{cname}[object]
END FUNCTION

FUNCTION SetCName(object,value)
  property{cname}[object] = value
END FUNCTION

FUNCTION GetAddr1(object)
  GetAddr1 = property{addr1}[object]
END FUNCTION

FUNCTION SetAddr1(object,value)
  property{addr1}[object] = value
END FUNCTION

FUNCTION GetAddr2(object)
  GetAddr2 = property{addr2}[object]
END FUNCTION

FUNCTION SetAddr2(object,value)
  property{addr2}[object] = value
END FUNCTION

FUNCTION New(base)
  instance += 1
  IF base = undef THEN
    _cname[instance] = _cname[0]
    _addr1[instance] = _addr1[0]
    _addr2[instance] = _addr2[0]
  ELSE
    REF property{cname}[instance] = property{cname}[base]
    REF property{addr1}[instance] = property{addr1}[base]
    REF property{addr2}[instance] = property{addr2}[base]
  END IF
  new = instance
END FUNCTION

FUNCTION Inherit(base)
  instance += 1
  property{cname}[instance] = property{cname}[base]
  property{addr1}[instance] = property{addr1}[base]
  property{addr2}[instance] = property{addr2}[base]
  Inherit = instance
END FUNCTION

FUNCTION PropList
  PropList = JOIN("|",property)
END FUNCTION

FUNCTION Destroy(object)
  _cname[object] = undef
  _addr1[object] = undef
  _addr2[object] = undef
END FUNCTION

END MODULE

'
' MAIN
'
PRINT customer::PropList()

--- End code ---

C:\scriptbasic\test>custobj
cname|<enter name>|addr1|<enter address 1>|addr2|<enter address 2>
C:\scriptbasic\test>

Navigation

[0] Message Index

[#] Next page

Go to full version