网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.如何根据类的名字来生成对象.
.用DELPHI实现特色按钮.
.Delphi数据库编程教程(二).
.如何在注册表中注册BDE.
.菜鸟入门之浅谈函数重载和多态的.
.启动外部程序并等待它结束.
.如何制作帮助文件.
.2个不错的通配符比较函数.
.如何将C/C++程序转译成Delphi(十.
.Delphi控制Excel的重要属性和方法.
.Windows优化大师注册机源码.
.在delphi中,如何把MDI工作区的粗.
.Delphi5的水晶报表控件在Delphi6.
.注册快捷方式.
.远程控制篇:服务端程序关机时的.
.Delphi常见图象格式转换技术.
.软件开发的管理和控制.
.用hook实现dll注入详解.
.窗体的建立时机及缓冲的思想在in.
.在应用程序中开关WINDOWS系统.

DELPHI面向对象支持特点--保护级类成员的应用

发表日期:2006-2-4


今天在CSDN论坛里面游逛,发现这样的一个帖子《刚才看到一位武林高手的几行精妙代码,百思不得其解,希望各位指点》,本着向各大武林高手学习的态度,我看完了整个帖子,发现内容甚为经典,记录于此,作个总结: 


 type
  TStringGridEx = class(TStringGrid);

procedure TForm1.Button1Click(Sender: TObject);
begin
  if TStringGridEx(StringGrid1).RowCount > 5 then
    TStringGridEx(StringGrid1).DeleteRow(5);
end;
---------------------------------------------------------

这是要在StringGrid中删除一行的代码。这个问题我搞了2个小时没有搞定,然后就搜帖子,发现这位高人的代码,简直敬佩之情如黄河之水绵绵不绝,运行也通过。但是为啥TStringGridEx = class(TStringGrid);这个东西就可以有DeleteRow()方法呢?它明明也是继承的TStringGrid,和TStringGrid是一样的啊?我头都大了!希望各位指点!


以上就是楼主提问内容,问题的确奇怪,经过各大掌门的讨论得出了一个DELPHI特有的保护级成员的应用特点,这应该也是DELPHI独有的一个面向对象支持特点,总结如下:


1.TForm里面可以访问到TStringGridEx的protected成员,因为它们定义在同一个单元里面
2.TForm里面不能访问到TStringGrid的protected成员,因为他们不是定义在同一个单元里面
3.由于TStringGridEx = class(TStringGrid),所以在这里访问TStringGridEx的protected成员就相当于访问TStringGrid的protected成员
4.TStringGridEx只是一个中介,功能没有扩展但是把TStringGrid的作用域引入到这个单元中来了,所以TForm可以访问TStringGrid的protected成员了

掌门一的看法是DELPHI的PROTECTED和PRIVATE成员对于同一UNIT里面的各种类和对象都是可见的,而且PROTECTED成员可以在友员子类的UNIT中可见,于是TStringGridEx 哪怕只是继承了TStringGrid没作任何修改,也令TStringGrid中的PROTECTED成员在TStringGridEx的UNIT中可见(这其中还有一个原因是TStringGrid并不是定义在本UNIT,所以只能通过继承使本UNIT成为友员,使TStringGrid的PROTECTED成员开放),问题解决了。我们也从中可以一窥DELPHI的面向对象特点。


 掌门二的评论:在同一个单元定义的两个类甚至可以互相访问对方的private成员
虽然方便了开发,但是很能迷惑初学者
甚至感觉不够严谨

不过反正delphi也风光不再了,凑乎用吧
掌门三的评论:没有完美的东西啊!只有适合的东西哦!
掌门四的评论:protected起来的方法一般是隐藏的,所以直接生成该类的实例是不能引用该方法的,但是在delphi中将位于同一个单元的类自动认为是友类,可以访问其protected方法,所以在相应单元中写一个子类的实现就可以看到protected起来的方法了
 


 个人觉得DELPHI对PROTECTED和PRIVATE在本单元可见的做法既方便了程序员又迷惑了程序员,使得很多以上的例子满奇怪的,当然这也令程序员增加了许多创造发挥技巧的机会,以上例子就是一个巧妙应用技巧的经典范例,不过个人觉得这些机会还是少一点好。无论如何,可读性才应该是程序员真正追求的代码境界,这些奇怪的技巧性代码,如果我使用其他语言一段时间以后再回来看它,可能怎样都无法想到问题的解答。不过既然选择的DELPHI也就选择了它的缺点,这有点像一对相爱的恋人,选择了对方也就等于选择了他的优点和缺点,世上本没有完美的东西,我们只能适应不完美,追求完美。


上一篇:取Run下所有值(原创) 人气:5599
下一篇:WINDOWS编程技巧之DELPHI篇 人气:12008
浏览全部Delphi的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐