What little I can find in the documentation implies that shared methods are similar to a module method.
There do not seem to be many ways that it acts like a module method.
Module methods can be Global, Protected, and Private
Shared methods can be Public, Protected, and Private
You can declare a shared method as being Public and then I can use it “outside” of the class by calling it with NameClass.theMethod. In this sense, it is like a Protectedmodule method which can be called with NameModule.theMethod. Public is not analogous to Global. You cannot call a shared method that is Public without the prefix of the name of the class. You could call a Globalmodule method without a prefix.
If you declare a shared method as being Protected, then it seems to be like a module method that is Private. It can only be used within the class itself . So a Protectedshared method seems analogous to a Privatemodule method.
So this brings up the question to me: What is a Privateshared method? How is it different than a Protectedshared method?
Why does Xojo give you the option of declaring a shared method as Public or Protected or Private? It seems to me that Protected is identical to Private when considering a shared method.
Unless you have an instance of a class that is active, you cannot call any of the methods of that class.
Methods within a module can be called al the time.
So for example, in a business application, you cannot call the methods of class InvoiceDoc unless you instanciated that class and you have a Invoice (as new InvoiceDoc) somewhere in your session. If you have a method called ReadPDFInvoice somewhere in a module, you can call that method at any given time. No class instance required.
Shared methods are part of the language design. Most people don’t need them in most cases, but they’re handy if you want to do something like enforce a single instance (rather than use a constructor). You can see the Design Patterns Singleton example included with Xojo, or the docs here: http://developer.xojo.com/userguide/classes$Shared%20Methods
Travis I think you missed the paradox. You DON’T HAVE TO CREATE AN INSTANCE to call “SHARED” methods. NON-Shared methods are not accessible. But a “Shared” method acts like the “CLASS” is a “MODULE” almost
to me it makes sense if you have TWO instances of a class, and they SHARE the method… but to me, there should be at least ONE instance for the class method to be visible
Well, Robert, I just learned something new. Now, why would I create methods in a class, that can operate independently from the class? My instinct says they should go in a module. I’ll have to think about this…
[quote=275878:@Dave S]Travis I think you missed the paradox. You DON’T HAVE TO CREATE AN INSTANCE to call “SHARED” methods. NON-Shared methods are not accessible. But a “Shared” method acts like the “CLASS” is a “MODULE” almost
to me it makes sense if you have TWO instances of a class, and they SHARE the method… but to me, there should be at least ONE instance for the class method to be visible[/quote]
That’s the point. A shared method doesn’t require an instance of the class. That’s how you can use them to return a single instance of a class (i.e., the class manages its own, single, instance in the background in the singleton pattern) rather than a constructor. They wouldn’t be able to perform that function of returning a single managed instance if they required an instance of the class to be called
My intent in real life was to organize my code in a simple fashion. I had a class pt2D (point in 2D space) that had two properties (x and y) that specified the location in space.
I needed a function that returned the distance between the two points. Now I could put that function in a module that took two parameters (two instances of the pt2D class) and that would work fine. But I thought, why not just make it a shared method so it was all “together” in the organization of the project.
So I created a shared method (calcDistance) of pt2D that would take two parameters (two instances of the pt2D class) and return the distance between them.
If I made that shared method Public then I could call it “outside” of the class itself. My code dealing with the points in 2D space was therefore all “in” the class organizationally. I could have written the distance function in some module. That works, but requires creating the module which seems unnecessary.
But this exercise required that the shared method be Public. And you have to call it with the construction: pt2D.calcDistance. A Globalmodule method would not require a prefix (name of the module) but a Protectedmodule method would.
If the shared method is Protected or Private, then it will not work in my context. But I wondered why, when Protected, pt2D.calcDistance was not allowed to be used outside the class itself. If it were a module method it would be useable outside the module.
And finally, trying to understand the entire topic, I wondered what is the difference between Protected and Private when considering a shared method.
McKay basically answered my question and Hare has cleanly summarized the whole thing in a way that I find clear.
[quote=275900:@Tim Hare]A shared method marked Public is equivalent to a module method marked Protected.
EXCEPT that in a shared class method you CAN create an instance & access the properties of the instance regardless of whether they are private public etc since the SHARED method IS part of the class so it can access all the innards