Q&A

  • Override 진정으로 필요한가?
다형성을 시험하던 중에,
virtual, override Keyword를 사용하지 않아도 다형성이 이루어지더군요.
그렇다면 왜 이런 키워드가 필요한 것인가요?
단지 나중에 코드의 가독성을 높이기 위한 것일까요?
(물론, 가독성 어~~~엄~~~첨 중요하다는 것 인정합니다).

2  COMMENTS
  • Profile
    최용일 2005.12.04 07:24
    안녕하세요. 최용일입니다.

    이상하네요.. 저는 암만해도 virtual,override를 사용하지 않으면 다형성이 이루어지지 않던데 이상하네요...
    진짜로 다형성을 테스트했는지 의문입니다. 아래 두개의 코드를 테스트해보세요...

    virtual을 사용하지 않으면 정적으로 링크되기 때문에 다형성이 이루어질 수가 없습니다.

    <!--CodeS-->
    사용안할때

    type
      TDraw = class(TObject)
      public
        procedure Show;
      end;
      TLineDraw = class(TDraw)
      public
        procedure Show;
      end;
      TRectDraw = class(TDraw)
      public
        procedure Show;
      end;

    implementation

    { TDraw }

    procedure TDraw.Show;
    begin
      ShowMessage('TDraw.Draw');
    end;

    { TLineDraw }

    procedure TLineDraw.Show;
    begin
      ShowMessage('TLineDraw');
    end;

    { TRectDraw }

    procedure TRectDraw.Show;
    begin
      ShowMessage('TRectDraw');
    end;

    procedure TfrmMain.Button1Click(Sender: TObject);
    var
      Draw: TDraw;
    begin
      Draw := TLineDraw.Create;
      try
        Draw.Show;  // Shows 'TDraw.Show'
      finally
        Draw.Free;
      end;
      Draw := TRectDraw.Create;
      try
        Draw.Show;  // Shows 'TDraw.Show'
      finally
        Draw.Free;
      end;
    end;

    <!--CodeE-->

    <!--CodeS-->
    사용할때

    type
      TDraw = class(TObject)
      public
        procedure Show; virtual;
      end;
      TLineDraw = class(TDraw)
      public
        procedure Show; override;
      end;
      TRectDraw = class(TDraw)
      public
        procedure Show; override;
      end;

    implementation

    { TDraw }

    procedure TDraw.Show;
    begin
      ShowMessage('TDraw.Draw');
    end;

    { TLineDraw }

    procedure TLineDraw.Show;
    begin
      ShowMessage('TLineDraw');
    end;

    { TRectDraw }

    procedure TRectDraw.Show;
    begin
      ShowMessage('TRectDraw');
    end;

    procedure TfrmMain.Button1Click(Sender: TObject);
    var
      Draw: TDraw;
    begin
      Draw := TLineDraw.Create;
      try
        Draw.Show;  // Shows 'TLineDraw.Show'
      finally
        Draw.Free;
      end;
      Draw := TRectDraw.Create;
      try
        Draw.Show;  // Shows 'TRectDraw.Show'
      finally
        Draw.Free;
      end;
    end;

    <!--CodeE-->

    ^^  항상 즐코하세요...

  • Profile
    쿠나 2005.12.20 02:46
    답변 감사드립니다.

    답변이 없어서 그동안 살펴보지 않았는데... 답변을 해 주셨군요 ^^;

    한번 해 보고 답변드리겠습니다 그럼  꾸벅