今天在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的面向对象特点。
不过反正delphi也风光不再了,凑乎用吧
掌门三的评论:没有完美的东西啊!只有适合的东西哦!
掌门四的评论:protected起来的方法一般是隐藏的,所以直接生成该类的实例是不能引用该方法的,但是在delphi中将位于同一个单元的类自动认为是友类,可以访问其protected方法,所以在相应单元中写一个子类的实现就可以看到protected起来的方法了
新闻热点
疑难解答
图片精选