Delphi控件求解
如何不利用继承机制,给现有的控件增加一个属性
比如
给TEdit增加一个XXX:String这样的属性,但是不要从TEdit继承下来一个类的这种方法
公司的一道面试题,同为Delphi开发人员,能力不够且特别好奇,故上来请大神们赐教
[解决办法]
不能继承,那就改源码
1.在private下面写一个变量FXXX:String;(没有private就添加进去)
2.在private下写一个方法procedure SetXXX(const Value: string);
再在TEdit类中实现此方法
procedure TEdit.SetXXX(const Value: string);
begin
FXXX:=Value;
end;
3.在protected下面写上此属性的读取方法(read,write)
property XXX: String read FXXX write SetXXX;
4.在published把属性XXX公布出来:property XXX;
[解决办法]
现在很多编程语言都提供一个叫帮助类(class helper)的机制,delphi的新版里面也有,举例如下:
- Delphi(Pascal) code
type TMyClass = class procedure MyProc; function MyFunc: Integer; end; ... procedure TMyClass.MyProc; var X: Integer; begin X := MyFunc; end; function TMyClass.MyFunc: Integer; begin ... end; ... type TMyClassHelper = class helper for TMyClass procedure HelloWorld; function MyFunc: Integer; end; ... procedure TMyClassHelper.HelloWorld; begin Writeln(Self.ClassName); // Self refers to TMyClass type, not TMyClassHelper end; function TMyClassHelper.MyFunc: Integer; begin ... end; ... var X: TMyClass; begin X := TMyClass.Create; X.MyProc; // Calls TMyClass.MyProc X.HelloWorld; // Calls TMyClassHelper.HelloWorld X.MyFunc; // Calls TMyClassHelper.MyFunc
[解决办法]
- Delphi(Pascal) code
一般属性(访问对象的接口)是服务于字段的。1.在private下面写一个字段FXXX:String;2.在private下写一个方法procedure SetXXX(const Value: string); 3.在published把属性在设计时可以设计:property XXX: String read FXXX write SetXXX;
[解决办法]
- Delphi(Pascal) code
一般属性(访问对象的接口)是服务于字段的。1.在private下面写一个字段FXXX:String;2.在private下写一个方法procedure SetXXX(const Value: string); 3.在published把属性在设计时可以设计:property XXX: String read FXXX write SetXXX;