首页  编辑  

多态的问题

Tags: /超级猛料/Language.Object Pascal/面向对象和类、VCL核心/   Date Created:

多态的问题

比方说有父类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'

是何原因。谢谢