Q&A

  • 델파이 지시어중 reintroduce?
안녕하세요?
델파이 지시어중

<!--CodeS-->
reintroduce
<!--CodeE-->

가 어떤 의미인지 아시는분 알려주세요.
2  COMMENTS
  • Profile
    구창민 2006.10.02 21:16
    안녕하세요...

    아래는 박후선님이 예전에 강의하신 내용중에 일부를 발췌한것입니다.

    원하시는 의미를 찾으실 수 있을거 같습니다.

    즐거운 프로그래밍 하세요~


    -------------------------
    ○ 메쏘드 오버로딩

    메쏘드 오버로딩이란 간단하다. 하나의 오브젝트 내에서 인자가 다른 경우  동일
    한 이름의 메쏘드를 여러개 작성할 수 있는 것이다. 이것은 생성자, 소멸자 일반
    메쏘드 모두에 공히 적용된다.


    constructor Create(AOwner: TComponent); overload; override;
    constructor Create(AOwner: TComponent; Text: string); overload;

    하지만, 동일한 구조의 인자인데 인자명만 바꾸어 다른 함수로 지정하는 것은 상
    식적으로 생각해봐도 의미 없는 일이며, 허용되지도 않는다.

    constructor Create(AOwner: TComponent; Name: string); overload;

    위에 이미 TComponent와 string형 인자를 받는 Create 생성자가 있기 때문이다.

    이로써 C++ 코드를 델파이로 포팅할 경우 발생할 수 있는 어지러운 상황들이 해
    결되게 되었으며, 별로  대단한 것은 아니지만,  코딩시 그간 누락되었던  OOP의
    주요 기법중 하나를 델파이상에서 누릴 수 있게 되었다.

    델파이 4에 들어와 새로운 지시어인 overload가 등장했는데 이것이 메쏘드  오버
    로딩을 위해 사용될 수 있다. 다른 인자를 가진 메쏘드들을 동일한 이름으로 구
    성한다는 것이 메쏘드 오버로딩의 주된 의미다. 상속된 메쏘드는 그 부모의 것을
    감추지 않더라도 새로운 인자를 가진 메쏘드로 오버로드될 수 있다. 메쏘드 호출
    시 인자의 구성에 따라 적절한 메쏘드가 호출 되기 때문이다. 만약 가상 메쏘드
    를 오버로드한다면, reintroduce 지시자를 이용해 오버로딩을 구성할 수 있다.

    type
      T1 = class(TObject)
        procedure Test(I: Integer); overload; virtual;
      end;
      T2 = class(T1)
        procedure Test(S: string); reintroduce; overload;
      end;
       ...
      SomeObject := T2.Create;
      SomeObject.Test('Hello!');  // calls T2.Test
      SomeObject.Test(7);         // calls T1.Test

    기억해야 할 사항은 클래스의 내부에서 같은 이름으로 다중 오버로드된 메쏘드는
    published의 멤버로  둘  수 없다.   런타임 타입 정보의   관리를 위해서는  각
    published 멤버에 유일한 이름이 사용되어야 하기 때문이다.

    type

      TSomeClass = class
      published
        function Func(P: Integer): Integer;
        function Func(P: Boolean): Integer  // error
         ...

    필자의 생각에, 대부분의 경우 published의 멤버로는 property가 올 것이므로 문
    제는 없다고 여겨진다.



  • Profile
    박성준 2006.10.03 03:20
    감사합니다.
    대충, 개념이 뭔지 알것 같습니다. ^^

    즐거운 한가위 되세요.