Jim McKeeth의 블로그에서 흥미로운 주제가 있어서 번역하였습니다. 본문에는 해당 요소들에 대한 링크가 있어서 더 깊이있게 이해할 수 있습니다. 본문 링크: https://community.idera.com/developer-tools/b/blog/posts/class-implementing-two-interfaces-with-duplicate-method-names

 

델파이는 ‘단일 상속’ 만을 지원합니다. 즉, 부모 클래스는 오직 1개만 가질 수 있습니다. 하지만, 인터페이스는 여러개 구현할 수 있습니다.

type
  TAthlete = class(THuman, IWalker, IJumper)

 

TAthlete 부모 클래스는 (아마 TInterfacedObject 후손인) THuman입니다그리고 IWalker IJumper 인터페이스를 구현합니다만약  IWalker IJumper 모두 run이라는 메소드를 가지고 있다면 어떻게 할까요?

 

type
  THuman = class(TInterfacedObject)
    procedure walk; virtual;
  end;

  IJumper = Interface(IInterface)
    procedure run;
  end;

  IWalker = Interface(IInterface)
    procedure run;
  end;

  TAthlete = class(THuman, IWalker, IJumper)
  end;

5141.Datamodel.png-1500x0.png

IWalker와 IJumper의 멤버들을 TAthlete에서 아직은 구현하지 않은 상태입니다.

  • [dcc32 Error] E2291 Missing implementation of interface method IJumper.run
  • [dcc32 Error] E2291 Missing implementation of interface method IWalker.run

TAthlete에서 이 인터페이스들을 구현할 때 IWalker와 IJumper 별로 다르게 run 메소드를 구현하고 싶다면? Method Resolution Clause (메소드 해소 구문)를 살펴보세요.

 

인터페이스 메소드 해소 구문

어느 클래스에서 2개 이상의 인터페이스를 구현하는데, 이 인터페이스들이 같은 이름으로된 메소드를 가지고 있다면 메소드 해소 구문을 사용하여 이름 충돌을 해소합니다. 클래스 선언부에 메소드 해소 구문을 넣어서 디펄트 이름-기반 매핑을 오버라이드할 수 있습니다. 아마 아래와 같이 인터페이스들을 구현하게 됩니다.

type
  TAthlete = class(THuman, IWalker, IJumper)
  public
    procedure IWalker.run = PowerWalk;
    procedure IJumper.run = RealRun;
  private
    procedure PowerWalk;
    procedure RealRun;
  end;

5226.method_resolution.png-640x480.png

 

하지만, 만약 TAthlete 개체에서 Run을 호출하면 어떻게 될까요? TAthlete 클래스에는 Run 메소드가 없습니다. 그리고 PowerWalk와 RealRun은 모두 private 멤버라서 클래스 참조로는 접근할 수 없습니다.

  var Athlete := TAthlete.Create;
  try
    (* E2003 식별자가 선언되지 않았다는 오류 발생
    Athlete.run;        // TAthlete에는 Run 메소드가 현재 없음
    Athlete.PowerWalk;  // PowerWalk는 Private 멤버임
    Athlete.RealRun;    // 이것 또한 Private 멤버임 *)

    // Run을 접근하려면 인터페이스 레퍼런스가 있어야 함
    IWalker(Athlete).Run; // TAthlete의 RealRun 메소드 호출하기
    IJumper(Athlete).Run; // TAthlete의 PowerWalk 메소드 호출하기
  finally
    Athlete.Free;
  end;

TAthlete에서 Run 호출하려면 약간 변경을 해야 합니다.

type
  TAthlete = class(THuman, IWalker, IJumper)
  public
    procedure IWalker.Run = PowerWalk;
    procedure Run;
  private
    procedure PowerWalk;
  end;

8561.less-explicit.png-640x480.png

이제 IJumper 디펄트 이름 기반 맵핑을 사용하고, IWalker 코드로 변경한 메소드를 사용하게 되었습니다.

 

var Athlete := TAthlete.Create;
  try
    Athlete.Run;          // 이제 Run 메소드를 사용할 수 있음
    IWalker(Athlete).Run; // TAthlete의 PowerWalk 메소드 호출
    IJumper(Athlete).Run; // TAthlete의 진짜 Run 메소드 호출
  finally
    Athlete.Free;
  end;

이름이 충돌할 경우에는 인터페이스를 명시하는 것이 일반적으로 좋은 방식입니다하지만경우에 따라 이와 같이 명시하지 않고 사용할 필요가 있는 경우도 있습니다델파이는   방식 모두를 제공하므로 개발자가 유연하게 코드를 작성할  있습니다

 

<Jim McKeeth 블로그에서 흥미로운 주제가 있어서 번역하였습니다.

본문에는 해당 요소들에 대한 링크가 있어서  깊이있게 이해할  있습니다.

 

본문 링크https://community.idera.com/developer-tools/b/blog/posts/class-implementing-two-interfaces-with-duplicate-method-names 

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 20845
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 19612
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 21713
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 27397
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 28692
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 24017
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 44763
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 180212
483 [10.4 시드니][업데이트 2] TNUMBERBOX – 새로운 VCL 컨트롤 관리자 2023.03.09 705
482 [고객사례-생산성도구, 델파이] Change-Pro for Excel - 엑셀 변경항목 분석 프로그램 관리자 2017.10.27 705
481 [업데이트][핫픽스][10.1 베를린] 갤럭시 S7 Edge(안드로이드 6.0.1) 디버깅이 되지않는 이슈 패치 험프리 2016.05.27 705
480 [베를린 U1] 윈도우 태스크바 알림의 뱃지를 제어할 수 있습니다. 험프리 2016.09.20 700
479 [도서/PDF/소스코드] 시작하는 사람들을 위한 델파이 프로그래밍-모듈 17. 1차원 정적 배열 관리자 2019.03.29 700
478 n [도서/PDF/소스코드] 시작하는 사람들을 위한 델파이 프로그래밍-모듈 7. 중접된 If...Then...Else 문. 작업 해결 실습하기 관리자 2019.03.29 700
477 [업데이트][핫픽스][10,2 도쿄] 툴체인 이슈 핫픽스 험프리 2017.05.10 700
476 [업데이트][핫픽스][10.3] 2018년 12월 패치 험프리 2018.12.17 699
475 [도서/PDF/소스코드] 델파이 Begin...End - 14장. 분산처리(DataSnap) 관리자 2019.08.20 698
474 C++빌더/델파이 개발자를 위한 최적의 데이터베이스 관리 도구 - 아쿠아 데이터 스튜디오 file 관리자 2018.12.11 697
473 이 달의 기술자료 - 2016년 05월 file 험프리 2016.04.26 693
472 [고객 사례- 의료, 델파이] COVID-19 격리 대상자 상태 관리 앱 관리자 2020.04.28 693
471 [고객 사례-영상 제작, 3D, 델파이] FrameForge - 3D 영상 제작 스토리보드 제작용 애플리케이션 관리자 2016.11.30 692
470 [델파이 샘플 코드] 안드로이드, iOS, OSX, 윈도우, 리눅스, HTML5 관리자 2019.11.13 691
469 [엠바카데로 Feature Friday] RAD스튜디오와 함께사용하면 더욱 강력하게 활용할 수 있는 컴포넌트들 관리자 2018.09.14 691
468 [10.2 도쿄][릴리즈2] RAD 서버 싱글 사이트 라이선스 제공 험프리 2017.12.13 691
467 [도서/PDF/소스코드] 시작하는 사람들을 위한 델파이 프로그래밍-모듈 23. 타이머 관리자 2019.03.29 689
466 n [도서/PDF/소스코드] 시작하는 사람들을 위한 델파이 프로그래밍-모듈 12. String(문자열)들 [1] 관리자 2019.03.29 689
465 안드로이드에서 커스텀 폰트 사용하기 - 델파이 10.2 도쿄 험프리 2017.05.15 689
464 [2020년 상반기] 기술자료 TOP 10 - 개발자들이 가장 많이 클릭한 기술자료는? 관리자 2020.07.07 685