如何安全地改写VCL类'A'的owned类成员a1,而又能让其它类'A'的成员函数'an'正常工作(50分)

  • 主题发起人 主题发起人 陈荻秋
  • 开始时间 开始时间

陈荻秋

Unregistered / Unconfirmed
GUEST, unregistred user!
有哪些方法可以安全地改写VCL类'A'的成员'a1'(owned类成员)
而又能让其它类'A'的成员函数'an'正常工作,正确引用.
例如:
改写TTreeNodes,给他加入一个TFieldLink以使它能显示数据库字段,
如何使用TTreeView类的其他成员函数?
 
对于绝大多数的VCL类,两个字:继承。
对于某些类实例,两个字:重载。
===============================
对于绝大多数的类,要安全改写其成员函数,你需要重新继承该类,派生新类来实现。前提是这个类成员具有可继承特性。
对于一些例化了的类实例(例如在一个程序中,TApplication和实例是Application)。他的某些成员是可以动态重载的。例如赋值Application.OnMessage := myMessage;前提是这个成员具有这种可重载的属性,即声明成procedure (var Msg: TMsg
var Handled: Boolean) of object一类的形式。("of Object"定义至关重要)
=============
另外,我所提供的答案中,某些术语用法可能和你的不同。因为C中的类和Delphi中的类两个描述的概念不一致。由C转来的程序员可能不适应我的术语用法,此外,我也自认对这些术语理解得不足够透彻。*^_^*
 
OO概念和方法我也了解一点点,有没有取巧的办法?
按照正统的办法,我想改写TTREENODE,
就得继承和重载几乎所有TREENODES的相关方法和TTREEVIEW的方法吗?
更何况,还有的可能是TTreeNode相关的静态函数,不能重载.
那末我就得完全抛弃原有的TTreeNodes和TTreeView吗?
 
1. 要继承. 如果继承很困难或者几乎要重写, 则是类设计时的问题.
2. 更正 aimingoo: Delphi/CBuilder 中的如 OnMessage 之类的是 property,
不是 member function (C++) / Method (Object Pascal). 本质不过
是函数指针, 是赋值而非重载.

 
以我的经验,用继承的方式重用一个VCL几乎不用任何额外工作量,
只需要编写自己新增的方法即可.

该VCL的全部属性与方法(除private外)自动被继承,可随意调用.
如果你的问题不是这个意思,有什么困难,不妨写详细一点.
 
讨论了这么多天, 你们还没讨论出一个结果来吗?

干脆去下载一个算啦, 我记得某位大虾的网站上有几个 DataAware 的 TrewView.
 
昨天中午才回到郑州,感谢holly对我的问题的纠正。
下载是省气力的方法,不过如果没有的话,还只得重写。
正如dwwang所说,该VCL的全部属性与方法(除private外)被继承。所以你不用担
心“不能使用其它成员函数”。
OnMessage的确只是一个Property(属性),与Pascal的Method(方法)在概念上有
异。所以类实例的解决方法应该说成是“给公开的(事件)属性赋值”。但事实上
,方法继承在实质上仍是给方法的函数入口指针重新赋值。——方法表实际上是
一个入口向量表。与Property不同的只是Method重载是在编译期完成的,而Property赋值是在运行期完成的。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
670
import
I
I
回复
0
查看
674
import
I
后退
顶部