aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2022-08-01 09:19:52 +1000
committerSteve Bennett <steveb@workware.net.au>2022-08-20 15:25:28 +1000
commit5af9d6a919b83e28a37ade2db8090a375a93ba53 (patch)
treefbfbbc5913481bb3baf4b4098f3d1ef772bd3902 /examples
parentd0c75cd790ce8b1eca79489c006dad5d530dc405 (diff)
downloadjimtcl-5af9d6a919b83e28a37ade2db8090a375a93ba53.zip
jimtcl-5af9d6a919b83e28a37ade2db8090a375a93ba53.tar.gz
jimtcl-5af9d6a919b83e28a37ade2db8090a375a93ba53.tar.bz2
oo: better object construction
Now a default constructor is created, as an alias for defaultconstrutor. The constructor is passed the arguments to new and by default this accepts a dictionary that is checked for valid instance variables and sets them. However the constructor can be replaced by one that takes arbitrary arguments. Thus we can how have: a new -optiona -optionb And the constructor is invoked with arguments '-optiona -optionab'. This makes object initialisation more flexible. ** Note: This is an incompatible change if you have classes with a constructor and you create object instances with new <dict>. Signed-off-by: Steve Bennett <steveb@workware.net.au> Documentation fixes - Co-authored-by: Adrian Ho <the.gromgit@gmail.com>
Diffstat (limited to 'examples')
-rw-r--r--examples/ootest.tcl38
1 files changed, 24 insertions, 14 deletions
diff --git a/examples/ootest.tcl b/examples/ootest.tcl
index 731e46a..b0b3665 100644
--- a/examples/ootest.tcl
+++ b/examples/ootest.tcl
@@ -13,12 +13,13 @@ puts "Account vars=[Account vars]"
puts "Account methods=[Account methods]"
puts ""
-# Create a constructor. This does validation, but it could
-# do other things
-Account method constructor {} {
- if {$balance < 0} {
- error "Can't initialise account with a -ve balance"
+# Create a constructor that takes a name and an optional balance.
+Account method constructor {who {amount 0}} {
+ if {$amount < 0} {
+ error "Can't initialise account for $who with a -ve balance"
}
+ set name $who
+ set balance $amount
}
# Now flesh out the class with some methods
@@ -42,8 +43,16 @@ Account method describe {} {
}
}
-# Now an instance, initialisition some fields
-set a [Account new {name "Bob Smith"}]
+# Since the constructor requires an argument, can't
+# not provide them
+try {
+ set a [Account]
+} on error msg {
+ puts "Correctly did not create uninitialised account"
+}
+
+# Now an instance, using the constructor for initialisation
+set a [Account new "Bob Smith"]
puts "---- object Account ----"
# We can use class methods on the instance too
@@ -70,10 +79,11 @@ class CreditAccount Account {
limit -1000
}
-CreditAccount method constructor {} {
- # Dummy constructor
- # If desired, manually invoke the baseclass constructor
- super constructor
+CreditAccount method constructor {who {amount 0}} {
+ # Invoke the baseclass constructor, then
+ # set the amount, which may be -ve
+ super constructor $who
+ set balance $amount
}
# Override the 'withdraw' method to allow overdrawing
@@ -96,7 +106,7 @@ puts "CreditAccount methods=[CreditAccount methods]"
puts ""
puts "---- object CreditAccount ----"
-set b [CreditAccount new {name "John White"}]
+set b [CreditAccount new "John White" -20]
puts b.vars=[$b vars]
puts b.classname=[$b classname]
@@ -128,8 +138,8 @@ puts "Total of accounts [$a get name] and [$b eval {return "$name (Credit Limit:
# Almost. We can't really distinguish those which aren't real classes.
# This will get all references which aren't simple lambdas.
puts "---- All objects ----"
-Account new {name "Terry Green" balance 20}
-set x [Account]
+Account new "Terry Green" 20
+set x [Account new -]
lambda {} {dummy}
ref blah blah