多态在语言的表现上就是用父类类型调用子类方法的实现,C++和C#是通过虚函数表来实现的,在具体实例化的时候把重载的函数地址写到虚函数表的地址列表中,我想X++应该也是这样实现的.
问题在于如果想访问子类特有的函数,该怎么玩,C#中必须用强制转化,将父类类型强制转化成子类类型,才能调用,强行转化的语法跟C语言一样,(子类型)父类型.在X++中没看到这种语法,不过可以直接赋值子类型=父类型,还可以直接赋值给object类型, object = 父类型,然后调用子类的方法.看代码吧
父类:
class SuperClass
{
}
void SuperMethod()
{
print "I am a SuperMethod";
}
{
}
void SuperMethod()
{
print "I am a SuperMethod";
}
子类
class DriveClass extends SuperClass
{
}
void SuperMethod()
{
print "I call the SuperMethod From DriveClass";
}
void DriveMethod()
{
print "I am a Drive Method";
}
{
}
void SuperMethod()
{
print "I call the SuperMethod From DriveClass";
}
void DriveMethod()
{
print "I am a Drive Method";
}
X++中调用子类特有的方法.
static void testJob(Args _args)
{
SuperClass sc;
DriveClass dc;
object o;
;
sc = new DriveClass();
//转化成子类,这在C#中是不允许的,C#必须用强行转化
dc = sc;
dc.DriveMethod();
//转化成Object类型,这在C#中是允许的,但不能调用子类的方法
o = sc;
o.driveMethod();
pause;
}
{
SuperClass sc;
DriveClass dc;
object o;
;
sc = new DriveClass();
//转化成子类,这在C#中是不允许的,C#必须用强行转化
dc = sc;
dc.DriveMethod();
//转化成Object类型,这在C#中是允许的,但不能调用子类的方法
o = sc;
o.driveMethod();
pause;
}
这也许是X++对类型不太敏感造成的.通过Object类型调用子类的方法在某种情况下是一种不错的注意,比如用类工厂创建的类,有时候并不知道其真正的子类类型,想得到其真正的类型需要重新执行类工厂的那一段判断逻辑,直接用object调用倒是简单一些,不过这样编译器不会执行编译时检查,如果真正被实例化的类,不包含object引用的方法,就会出现运行时错误,这个可不是什么好事情.