T Tigerchamp Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-05 #1 对元件之间方法和过程的继承关系很疑惑,具体问题提出如下:动态生成的控件和静态生成的控件所能调用的方法好象不完全一样,动态能用,静态却不可识别.不知是怎么回事.请问哪位大侠能详细告知祖先和子孙之间的继承关系.(protected的作用范围究竟是什么)?
对元件之间方法和过程的继承关系很疑惑,具体问题提出如下:动态生成的控件和静态生成的控件所能调用的方法好象不完全一样,动态能用,静态却不可识别.不知是怎么回事.请问哪位大侠能详细告知祖先和子孙之间的继承关系.(protected的作用范围究竟是什么)?
唐 唐晓锋 Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-05 #2 建议你找本DELPHI的书看看!肯定比我们说好! 我有一本冲网上下载的DELPHI2的书,很不错! 你要的话通知我<A HREF="MAITTO:XFTANG@SHTDU.EDU.CN">xftang@shtdu.edu.cn</A>
建议你找本DELPHI的书看看!肯定比我们说好! 我有一本冲网上下载的DELPHI2的书,很不错! 你要的话通知我<A HREF="MAITTO:XFTANG@SHTDU.EDU.CN">xftang@shtdu.edu.cn</A>
J jiangtao Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-05 #3 动态和静态生成的控件应该是一样的,不知 你说的不能执行有无sample proteted的函数和数据,只能由当前类和子类使用。 可以看《Delphi 2程序大全》或《Delphi 3从入门到精通》 <Delphi 2 Unleashed>和 <Mastering Delphi 3>
动态和静态生成的控件应该是一样的,不知 你说的不能执行有无sample proteted的函数和数据,只能由当前类和子类使用。 可以看《Delphi 2程序大全》或《Delphi 3从入门到精通》 <Delphi 2 Unleashed>和 <Mastering Delphi 3>
H huizhang Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-05 #4 jiangtao 说的一点没错, 动态生成的控件能够调用的方法静态肯定也可以 protected 方法可以被一个类自身以及它的子孙们调用; private 声明的方法变量 等只能在同一个 unit 中被其他类或者函数识别; 一个子类, 可以继承它的父类的 除了 private 以外全部的方法, 事件, 属性... 例如你自定义一个类, 如果在 create 的时候没有任何需要初始化的东西, 你就不 需要再次声明它的 create 方法; 如果在销毁该类是不需要释放任何东西, 你也同 样不需要声明它的 destroy 方法; 至于属性, 一定要放在 published 部才能静态地看到; 你的问题应该从程序中找原 因
jiangtao 说的一点没错, 动态生成的控件能够调用的方法静态肯定也可以 protected 方法可以被一个类自身以及它的子孙们调用; private 声明的方法变量 等只能在同一个 unit 中被其他类或者函数识别; 一个子类, 可以继承它的父类的 除了 private 以外全部的方法, 事件, 属性... 例如你自定义一个类, 如果在 create 的时候没有任何需要初始化的东西, 你就不 需要再次声明它的 create 方法; 如果在销毁该类是不需要释放任何东西, 你也同 样不需要声明它的 destroy 方法; 至于属性, 一定要放在 published 部才能静态地看到; 你的问题应该从程序中找原 因
T Tigerchamp Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-05 #5 书我都看过,但确实有如下问题,还希望大家继续帮忙。 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TMystring=class(Tstringgrid); TForm1 = class(TForm) StringGrid1: TStringGrid; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; mystring:Tmystring; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Mystring:=Tmystring.create(self); Mystring.parent:=self; Mystring.HideEditor; Stringgrid1.HideEditor; /./Undeclared identifier end; end. 上面的这个例子,当编译时最后一行出错,请指教。 是不是stringgrid1是form1的成员,所以....?
书我都看过,但确实有如下问题,还希望大家继续帮忙。 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TMystring=class(Tstringgrid); TForm1 = class(TForm) StringGrid1: TStringGrid; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; mystring:Tmystring; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Mystring:=Tmystring.create(self); Mystring.parent:=self; Mystring.HideEditor; Stringgrid1.HideEditor; /./Undeclared identifier end; end. 上面的这个例子,当编译时最后一行出错,请指教。 是不是stringgrid1是form1的成员,所以....?
D dwwang Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-05 #6 哈哈!太神奇了, Tigerchamp的这个问题使我得到了意想不到的"重大发现": 请将TMystring=class(Tstringgrid);这句话移动另一个 Unit中(如:Unit2),然后在本模块中use Unit2, 你将发现 Mystring.HideEditor;这句话也通不过编译了, 也是Undeclared identifier。 这说明Delphi通过在一个Unit中定义类的方法实现了C++中的friend语义, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 即:友类,从而可以访问protect属性/方法!这我怎么从没听说过呢? 我建议给Tigerchamp老兄一定的奖励, (我记得有人提出过给提高水平问题的人奖励的说法) 另外那位大虾早就知道这个问题,也请通报一声,免得 我坐井观天,自己以为发现什么新大陆了呢! ^_^
哈哈!太神奇了, Tigerchamp的这个问题使我得到了意想不到的"重大发现": 请将TMystring=class(Tstringgrid);这句话移动另一个 Unit中(如:Unit2),然后在本模块中use Unit2, 你将发现 Mystring.HideEditor;这句话也通不过编译了, 也是Undeclared identifier。 这说明Delphi通过在一个Unit中定义类的方法实现了C++中的friend语义, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 即:友类,从而可以访问protect属性/方法!这我怎么从没听说过呢? 我建议给Tigerchamp老兄一定的奖励, (我记得有人提出过给提高水平问题的人奖励的说法) 另外那位大虾早就知道这个问题,也请通报一声,免得 我坐井观天,自己以为发现什么新大陆了呢! ^_^
T tqz Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-05 #7 hehe,同一个Unit内,连另一个class的私有成员都可以访问呢,更别说protect 属性了。VCL库的源代码中就有这种取巧的例子。
R Rat Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-05 #8 如果大家经常看delphi Bugs Lists的话就会发现从1.0开始就这样了. 可能是为了自己写的方便. vcl理的确有很多这样的例子.
D dwwang Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-05 #9 既然如此,看来是我孤陋寡闻了 (( 不过总算运气好,又抢了个先 )) 其实,想来这样做也是很人性化的,"符合"OO的原理-- 既然编程人员"看得见",干吗让被编的类"看不见"呢?^_^
H huizhang Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-06 #10 看了 Tigercham 的例子才知道它的问题是怎么回事, 问题是: >动态生成的控件和静态生成的控件所能调用的方法好象不完全一样,动态能用,静态却 >不可识别. 而它的例子与问题不是一回事, 例子中是: 继承的时候能够调用的方法与动或静态生 成的控件所能调用的方法不是一回事. 这一点也不奇怪, 设置 protected 段的宗旨就是要解决控件使用时不可见而继承中 可见的问题. 实质上 protected 如同 private 只是它的范围比较宽, 能够让它的 子孙见到, 而其他 object 不可见. 用 dwwang 的话来说确实 "神奇".
看了 Tigercham 的例子才知道它的问题是怎么回事, 问题是: >动态生成的控件和静态生成的控件所能调用的方法好象不完全一样,动态能用,静态却 >不可识别. 而它的例子与问题不是一回事, 例子中是: 继承的时候能够调用的方法与动或静态生 成的控件所能调用的方法不是一回事. 这一点也不奇怪, 设置 protected 段的宗旨就是要解决控件使用时不可见而继承中 可见的问题. 实质上 protected 如同 private 只是它的范围比较宽, 能够让它的 子孙见到, 而其他 object 不可见. 用 dwwang 的话来说确实 "神奇".
H huizhang Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-06 #11 procedure TForm1.FormCreate(Sender: TObject); var MyString: TCustomGrid; begin MyString:=TCustomGrid.create(self); MyString.parent:=self; MyString.HideEditor; MyString.free; end; 试试这一段程序, 会得出同样的结论 -- protected 如果不是继承时同 private
procedure TForm1.FormCreate(Sender: TObject); var MyString: TCustomGrid; begin MyString:=TCustomGrid.create(self); MyString.parent:=self; MyString.HideEditor; MyString.free; end; 试试这一段程序, 会得出同样的结论 -- protected 如果不是继承时同 private
T Tigerchamp Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-07 #13 多谢大家的积极参与,可惜小弟的分不多,请包涵!
T Tigerchamp Unregistered / Unconfirmed GUEST, unregistred user! 1998-12-07 #14 多谢大家的积极参与,可惜小弟的分不多,请包涵!