Q&A

  • 부모의 protected된 메소드를 사용하고 싶은데..설명,예제 부탁합니다
제목 그래로 입니다..

부모의 프로텍티드된 메소드를 사용하고 싶은데..

어떤 방법으로 하면 되는지..

쫌 설명 부탁합니다..



1  COMMENTS
  • Profile
    구창민 2000.06.03 21:39
    어린왕자 wrote:

    > 제목 그래로 입니다..

    > 부모의 프로텍티드된 메소드를 사용하고 싶은데..

    > 어떤 방법으로 하면 되는지..

    > 쫌 설명 부탁합니다..

    >





    안녕하세요~ 구창민입니다.



    간단한 예를 보기위해, 만만한 TEdit 에서 파생된 클래스를 봅시다.



    아래에 있는 소스는 세자리 콤마 Edit인데 TEdit에서 상속되었죠.



    public 부분의 CreateParams 메쏘드를 자세히 보세요.



    엄마 클래쓰의 protected의 메소드들은 상속받은후



    public 으로 재선언해야 한다고 일전에 어린왕자님께 말씀드린적이 있을 겁니다.



    그 이유를 다시 간단히 말씀드리면,



    예를들어, TEdit에서 자손이 여러종류로 파생될 필요가 있을때



    TEdit의 메소드들중 어떤 자손은 필요없고, 어떤자손은 필요있고



    그러한 경우가 생깁니다.



    그래서, private 에 선언할 수도 없고, public에 선언할 수도 없는



    그런 메소드들을 protected에 선언해 두고 필요한



    자손들만 public에 재선언 하여 사용하도록 하고 있는 것입니다.



    VCL를 두루 살펴보면 TObject라는 클래스로부터



    시작하여 점점 새로운 클래스를 만들어 가는 것을 볼수있을 겁니다.



    그 점진적 진행을 가만히 들여다 보면 참 재미있습니다.



    많은 것을 알게 되구요..제가 제대로 설명 드린건지 모르겠습니다.



    그럼, 이해 되셨을 줄 믿고 즐거운 프로그래밍 하시길~



    아래는 콤마 Edit의 소스입니다.



    type

    TNumberEdit = class(TEdit)

    private

    { Private declarations }

    protected

    { Protected declarations }

    procedure Change; override;

    public

    { Public declarations }

    procedure CreateParams(var Params: TCreateParams); override; <--요놈

    constructor Create(AOwner: TComponent); override;

    published

    { Published declarations }

    end;



    procedure Register;



    implementation



    procedure TNumberEdit.Change;



    function Unmask( Value : String ) : Extended;

    var i: Byte;

    T: String;

    begin

    if Length( Trim( Value ) ) = 0 then begin

    Result := 0;

    Exit;

    end

    else begin

    T := '';

    for i := 0 to Length( Value ) - 1 do

    if Copy( Value, i+1, 1 ) <> ',' then

    T := T + Copy( Value, i+1, 1 );

    try

    Result := StrToFloat( T );

    except

    Result := 0;

    end;

    end;

    end;



    begin

    Text := FormatFloat( '###,###,###,###', Unmask( Text ) );

    if Length( Trim( Text ) ) > 0 then begin

    SendMessage( Self.Handle, WM_KEYDOWN, VK_END, LongInt(0));

    SendMessage( Self.Handle, WM_KEYUP , VK_END, LongInt(0));

    end;

    inherited Change;

    end;



    procedure TNumberEdit.CreateParams(var Params: TCreateParams);

    begin

    inherited CreateParams( Params );

    Params.Style := Params.Style or

    ES_MULTILINE or

    ES_RIGHT or

    ES_NUMBER or

    ES_WANTRETURN;

    end;



    constructor TNumberEdit.Create(AOwner: TComponent);

    begin

    inherited Create( AOwner );

    AutoSize := False;

    end;



    procedure Register;

    begin

    RegisterComponents( 'Samples', [ TNumberEdit ] );

    end;



    end.