关于RTTI的问题(25分)

  • 主题发起人 主题发起人 sanhippo1
  • 开始时间 开始时间
S

sanhippo1

Unregistered / Unconfirmed
GUEST, unregistred user!
Mastering Delphi 4第80页:
type
TAnimal = class
...
TDog = class (TAnimal)
...
function Eat: string
virtual;
TCat = class (TAnimal)
...

var
MyAnimal:TAnimal;

begin
1) MyAnimal:=TAnimal.Create;
2) //或 MyAnial:=TDog.Create;
3) if MyAnimal is TDog then TDog(MyAnimal).Eat;
4) //或(MyAnimal as TDog).Eat

a. 我有点不明白关于RTTI。
我在想如果执行了1),那3)条件不满足,不会执行。
但如执行了2),MyAnimal已经引用了TDog,为什么还要用TDog(MyAnimal)强制转换?
同样也如4),如引用TDog为什么还要as呢?

b. 引用TCat的对象是否也能用Eat?也用强制转换?

问题简单,请莫见笑。
 
呵呵,你还是先看看OOP编程的一些书籍把.
 
a. 我有点不明白关于RTTI。
我在想如果执行了1),那3)条件不满足,不会执行。
//nod
但如执行了2),MyAnimal已经引用了TDog,为什么还要用TDog(MyAnimal)强制转换?
同样也如4),如引用TDog为什么还要as呢?
//如果不转换,那么系统就把MyAnimal识别成一个TAnimal类,只有TAnimal的
方法和属性可用。

b. 引用TCat的对象是否也能用Eat?也用强制转换?
//如果TCat类有这个eat,那也需要强制转换来调用。

其实想想很多方法都使用Sender:TObject作为参数的,你就明白了。
MyAnimal:=TDog.Create;

Dog := TDog.Create;
MyAnimal := Dog;
是一会事。
 
接受答案了.
 
后退
顶部