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

2016-02-19 21:31 6 1 收藏

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的DELPHI面向对象支持特点--保护级类成员的应用教程,一起来看看吧!超容易上手~

【 tulaoshi.com - 编程语言 】

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

  

   type
    TStringGridEx = class(TStringGrid);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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也就选择了它的缺点,这有点像一对相爱的恋人,选择了对方也就等于选择了他的优点和缺点,世上本没有完美的东西,我们只能适应不完美,追求完美。

  


来源:http://www.tulaoshi.com/n/20160219/1626378.html

延伸阅读
标签: Web开发
什么是面向对象的 CSS 框架?工具?哲学? Object-oriented CSS is a coding paradigm that styles "objects" or "modules"nestable chunks of HTML that define a section of a webpagewith robust, reusable styles. 很像语言的进化 令 CSS 更强大 有什么不同? ul{...}ul li{...}ul li a(②但是,结构在这里){①...
经常听见别人说面向对象的程序设计,以前在学校上课的时候,也有开面向对象程序设计这门课。可是不幸的是,这些都是以C++,甚至VC++为基础的。而更加不幸的是,多年以来我一直是一个C的使用者。在学校的时候,我主要做的是硬件上的驱动层,和底层功能层。 !-- frame contents -- !-- /frame contents -- 在工作以后,又做的是手...
上两篇内容我们着重说了结构体相关知识的操作。 以后的内容我们将逐步完全以c++作为主体了,这也意味着我们的教程正式进入面向对象的编程了。 !-- frame contents -- !-- /frame contents -- 前面的教程我已经再三说明,结构体的把握非常重要,重要在哪里呢?重要在结构体和类有相同的特性,但又...
3.CALLBACK函数。 我觉得这是C语言的一个创举,虽然它很简单,就象如何把鸡蛋竖起来一样,但是你假如没想到的话,嘿嘿。 !-- frame contents -- !-- /frame contents -- 假如说静态入口函数实现了一个可治理的宏观的话,CallBack就是实现了一个可进化的微观:它使得一个函数可以在不重新编译的情况下实现功能的添加!但是在最最...
标签: PHP
简介 真正的天才具有正确评价不确定的,有风险的和矛盾的信息的能力。--邱吉尔 使用许多编程语言时,你通常只能使用面向对象或面向过程二者之一的编程方式。而在PHP中,你可以自由选择或混用。目前绝大多数PHP程序员使用面向过程的方式,因为解析WEB页面本身就非常过程化(从一个标签到另一个标签)。在HTML中嵌入过程处理代码是...

经验教程

151

收藏

18
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部