如何不利用继承机制,给现有的控件增加一个属性
比如
给TEdit增加一个XXX:String这样的属性,但是不要从TEdit继承下来一个类的这种方法公司的一道面试题,同为Delphi开发人员,能力不够且特别好奇,故上来请大神们赐教

解决方案 »

  1.   

    不能继承,那就改源码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;
      

  2.   

    现在很多编程语言都提供一个叫帮助类(class helper)的机制,delphi的新版里面也有,举例如下: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
      

  3.   

    重写文本框,一般是从TCustomEdit继承。那什么直接从TEdit继承的只是小打小闹做不出多少名堂。
      

  4.   


    一般属性(访问对象的接口)是服务于字段的。1.在private下面写一个字段FXXX:String;2.在private下写一个方法procedure SetXXX(const Value: string);
      
    3.在published把属性在设计时可以设计:property XXX: String read FXXX write SetXXX;
      

  5.   


    一般属性(访问对象的接口)是服务于字段的。1.在private下面写一个字段FXXX:String;2.在private下写一个方法procedure SetXXX(const Value: string);
      
    3.在published把属性在设计时可以设计:property XXX: String read FXXX write SetXXX;