[Gambas-user] dynamic created Menus
Tobias Boege
taboege at ...626...
Thu Feb 16 00:45:02 CET 2017
On Wed, 15 Feb 2017, Gianluigi wrote:
> Hi Tobias,
>
> kindly can you deepen the concept of static.
> See attached project.
>
For reference: this is the Main routine
Public Sub Main()
Dim cl As New Class1
Print cl.myAdd(12, 12)
Print cl.myAdd() ' I expected zero
Print Module1.myAdd(12, 12)
Print Module1.myAdd() ' I expected 24
End
and in Class1 as well as Module1 we have
Public Function myAdd(Optional a As Integer, b As Integer) As Integer
Return (a + b)
End
where one is a static method and the other is not.
Let me first explain static vs. dynamic in general, then you'll see why the
code prints
24
0
24
0
You can declare variables, properties and methods as either static or
dynamic in Gambas. If you don't declare it as static, then it's dynamic.
If a variable is dynamic, then each object you create from the class
receives its own separate memory region for the variable, so the value
of the variable can be different in every object. This is usually what
you want (hence there is no extra keyword to make things dynamic, they
are by default, unless you make a module). If you declare a variable as
static, you can think of the variable belonging not to an object but to
the class itself. All objects you create from the class will share the
same memory region for a static variable. If you modify the variable
from one object, the change is visible in all other objects.
This is what happens to variables. If you make a method static, then it
also "belongs to the class" (not to dynamic objects), in the sense that
you can only access static variables from a static method. Lastly a static
property is just implemented by using the two static Property_Read() and
Property_Write() methods, so the explanation of static methods applies
here as well.
Now about your code: the myAdd() method just calculates the sum of its
arguments. It does not access any variables. Whether something is static
or not only makes a difference if you access memory in your class or object.
The attached project serves better to highlight the difference, because
it actually *stores* values, once statically and once dynamically:
' Main.module
Public Sub Main()
Dim x, y As New Class1
Dim u, v As New Module1
x.Add(10)
y.Add(5)
x.Print()
y.Print()
Print "---"
u.Add(10)
v.Add(5)
u.Print()
v.Print()
End
' Class1.class and Module1.module identical code
Public sum As Integer
Public Sub Add(a As Integer)
sum += a
End
Public Sub Print()
Print sum
End
Output is
10
5
---
15
15
because in the first half, x and y have a dynamic sum variable, i.e. both
objects have their own variable, whereas in the second case sum is static,
so both additions actually go to the same region in memory and you get
10+5 = 15.
Regards,
Tobi
--
"There's an old saying: Don't change anything... ever!" -- Mr. Monk
-------------- next part --------------
A non-text attachment was scrubbed...
Name: TestFunction-0.0.2.tar.gz
Type: application/octet-stream
Size: 11490 bytes
Desc: not available
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20170216/38b0d8b9/attachment.obj>
More information about the User
mailing list