【求助】Delphi 中 as 运算符作用

ymwtz 2018-05-22 12:07:47
看了Delphi教程和论坛里帖子还是不太明白as的用处
假设有一个基类TShape,派生类TTriangle和TRectangle,变量G_Shape : TShape,然后G_Shape := TTriangle.Create;
那么G_Shape.Print和(G_Shape as TTriangle).Print有什么区别
还有,既然as是类型转换,那么为什么(G_Shape as TShape) is TTriangle返回的是True,是我理解的有问题吗。。。
请各位指教
...全文
1143 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongss 2018-05-23
  • 打赏
  • 举报
回复
引用 2 楼 DelphiGuy 的回复:
as是做类型检查的强制类型转换,只适用于对象(实例)的类型转换,A as B是把A实例当作B类来使用,A必须是B类或者B的派生类,但是并不改变A的实际类型
lyhoo163 2018-05-22
  • 打赏
  • 举报
回复
个人理解: As用于将一个对象转换为另一个对象 Is用于对象的判断, 有某些情况下, 也可以作"As"使用 基类 TShape 派生类 TTriangle TRectangle G_Shape : TShape // 指定基类 G_Shape := TTriangle.Create; // 给基类指定一个子类的实例 G_Shape.Print 实质上是 Triangle.Print G_Shape as TTriangle // 将G_Shape 转换为 TTriangle ,此前 G_Shape 已经是TTriangle (G_Shape as TTriangle).print 和 G_Shape.Print 基本一致,只是表现形式不同, (G_Shape as TShape) is TTriangle 就是 True。
hj8090 2018-05-22
  • 打赏
  • 举报
回复
不是转换类型后不起作用,是没有理解 is , G_Shape Is TTriangle,G_Shape Is TShape,G_Shape Is TGraphicControl,G_Shape Is TControl 都是成立的,向上都成立,具体的类型可用G_Shape.ClassName判断。
ymwtz 2018-05-22
  • 打赏
  • 举报
回复
引用 1 楼 hj3000 的回复:
Procedure TForm1.FormCreate(Sender: TObject); Var I: Integer; Begin For I := 0 To Self.ComponentCount - 1 Do Begin If (Self.Components[I] Is TPanel) Then Begin (Self.Components[I] As TPanel).BevelOuter := bvNone; End; End; End;
所以意思是用as转换之后就能访问派生类的静态的成员了吗。。。 另外,大佬你能解答一下为啥as转换类型后用is判断不起作用的原因吗。。。我那么写问题出在哪?
  • 打赏
  • 举报
回复
as是做类型检查的强制类型转换,只适用于对象(实例)的类型转换,A as B是把A实例当作B类来使用,A必须是B类或者B的派生类,但是并不改变A的实际类型
hj8090 2018-05-22
  • 打赏
  • 举报
回复
Procedure TForm1.FormCreate(Sender: TObject); Var I: Integer; Begin For I := 0 To Self.ComponentCount - 1 Do Begin If (Self.Components[I] Is TPanel) Then Begin (Self.Components[I] As TPanel).BevelOuter := bvNone; End; End; End;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧