多态的问题
比方说有父类TANIMAL和子类TDOG,
变量申明:VAR MYANIMAL:TANIMAL;
赋值: MyAnimal:=TDog.create;
那么,对象MyAnimal所具有的属性方法是TANIMAL 还是 TDOG的
好象方法是TANIMAL的,那数据是哪个的?
abstract,virtual是为子类函数重载创造便利。
abstract只告诉编译器该处有个函数入口,但是没有函数体。
virtual则是既有入口,又有函数体的。用override子类同名函数就可以覆盖父类的函数。
大多event里都有个叫sender的参数,它是tobject类型。
由sender可以as成很多类,其实sender在这儿提供的就是一个指针。
as告诉编译器寻找相应的成员函数入口。所以只要是子类,都可以由父类指针获得。
所以你提的问题就象一个路牌指向某条街,no.1是父类,no.2,3,。。。都是子类,
由路牌可以找到no.1,加上相对位置可以继续找到no.2,3。。。。所以,
你非要说指针指向的是什么,那么我回答都可以(在同一父,子类中)。
声明成什么Delphi就认为它是什么。用TDog.create创建的Myanimal
实际上已经具有了TDog类的属性,但是Delphi仍认为它是你
声明的那个类的实例,也就是Tanimal的实例,这时你给Myanimal赋TDog特有的属性
值就会发生错误。而你通过强制类型转换TDog(Myanimal),把Myanimal
转换为TDog类型后,就可以给TDog特有的属性赋值了。
yherxl:
我搞懂了,做了个试验。结果是:
1。变量申明成什么类型,他就具有那个类型的数据和方法。
2。使用父:=子,则父只是子的一个子集。为了让父有与子一样的表现,必须:
3。在父类中申明与子类相同的抽象虚拟方法,这样才能使用子类的方法
4。使用类型转换,才能使用子类的数据
不知有无差错,请各位大侠指正
ps:关了compiler的代码优化,在evaluate中观察某个表达式,仍然说'expression inaccessable'
是何原因。谢谢