Three method accessibility modifiers in X++ language :
Shortly, public allows for unrestricted use by any classes, protected – only by derived and declaring, private narrows access to declaring class. So, by theory, we shouldn’t be able to access private method outside declaring class. In X++ this is true and false at the same time. How is it possible? Surprisingly, it is very simple. We only need to cast an instance of our class to the object type – base class from which all other classes are derived. Please apply and run following (pseudo) code and you will see.
Shortly, public allows for unrestricted use by any classes, protected – only by derived and declaring, private narrows access to declaring class. So, by theory, we shouldn’t be able to access private method outside declaring class. In X++ this is true and false at the same time. How is it possible? Surprisingly, it is very simple. We only need to cast an instance of our class to the object type – base class from which all other classes are derived. Please apply and run following (pseudo) code and you will see.
class
TestClass1
{
public
void publicMethod()
{
info("Hey, I'm
public!");
}
protected
void protectedMethod()
{
info("Hey, I'm
protected!");
}
private
void privateMethod()
{
info("Hey, I'm
private!");
}
}
class
TestClass2
{
public
static void main(Args args)
{
TestClass1 class1;
Object objectClass1;
class1 = new
TestClass1();
objectClass1 = class1;
objectClass1.publicMethod();
objectClass1.protectedMethod();
objectClass1.privateMethod();
}
}
I
personally see this functionality as a bug, but quite useful one. It happed to
me already few times, that I had to invoke some private methods. Normally I
would overwrite interested object and change its access modifier. But this
approach is definitely not elegant. Firstly, having copy in upper layer can
cause some problems when upgrading. Secondly, we globally and explicitly change
developer’s will.
Summarizing,
both solutions should be deeply considered before use, but one of them seems to
be much easier to implement.
There
is more. Similarly, we can also invoke private table methods. Of course instead
of object type a common must be used.
0 comments:
Post a Comment