ScriptBasic > Tutorials
ScriptBasic OOP
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