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 14390
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
269 [고객 사례- 델파이, 모바일, 전략] 축구 전술 기획 앱 - Soccer Playview 관리자 2021.08.20 1307
268 REST 웹서비스, 델파이에서 어떻게 활용해야 할까요? 관리자 2021.08.11 1200
267 델파이용 로우 코드 앱 마법사(LOW CODE APP WIZARD) 관리자 2021.06.25 1271
266 TEdgeBrowser에서 스크립트 실행하기와 소스 보기 관리자 2021.06.22 2279
265 [개발 예제] 웹 소켓 서버&클라이언트 채팅 프로그램 관리자 2021.06.08 2241
264 내가 델파이를 계속 선택하는 이유 관리자 2021.06.01 1174
263 [오브젝트 파스칼을 처음 접하는 사람들을 위한] 무료 튜토리얼 비디오 (DEREK BANAS) 관리자 2021.05.25 488
262 델파이 코드 정적 분석기 V2.4 출시 및 무료 다운로드 관리자 2021.05.25 722
261 NEW! 델파이 오브젝트 파스칼 스타일 가이드 관리자 2021.05.04 508
260 머신 러닝: 윈도우 앱에 적용하는 5가지 방법(파이썬과 델파이) 관리자 2021.04.30 494
259 파스칼(PASCAL) 언어 50년과 델파이(DELPHI) 관리자 2021.03.31 847
258 가장 강력한 ‘데이터베이스 연동’ 기능을 자체적으로 제공하는 프레임워크는? (델파이 VS. WPF VS. ELECTRON) 관리자 2021.03.04 661
257 [UX Summit 요약] 윈도우10에 멋진 플루언트UI 룩앤필을 델파이로 구현하기 #2 (Giving your Apps the Fluent UI Look and Feel with Delphi #2) 관리자 2021.03.02 720
256 [고객 사례- 델파이, 교육] 교육용 프로그래밍 도구 – DEVFLOWCHARTER 관리자 2021.02.19 521
255 26년, 델파이 이야기 관리자 2021.02.17 2285
254 [DelphiCon 요약] 델파이로 웹 다루기 (Powering the Web with Delphi) file 관리자 2021.02.16 1095
253 [고객 사례- 금융, 델파이] 주식, 화폐 등 금융 정보 분석 소프트웨어 - 게임스탑, 비트코인, 아마존, 구글 등 관리자 2021.02.04 613
252 ‘장기 활용 가능성’이 가장 뛰어난 프레임워크는? (델파이 VS. WPF VS. ELECTRON) 관리자 2021.02.01 458
251 [델파이 웹개발] 델파이로 풀스택 웹 개발하기 - uniGUI 활용 (Full Stack Web Development with uniGUI for Delphi) file 관리자 2021.02.01 4277