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 17830
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 16187
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 18840
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 24414
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 25794
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 21152
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 41743
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 177043
30 [델파이 문법] 클래스와 객체 #4 file 관리자 2012.04.19 6482
29 [델파이 문법] 클래스와 객체 #3 file 관리자 2012.04.18 9331
28 [델파이 문법] 클래스와 객체 #2 [1] file 관리자 2012.04.17 7506
27 [델파이 문법] 클래스와 객체 #1 file 관리자 2012.04.12 10875
26 [델파이 문법 시리즈] #4. 익명메소드 - 활용법(마지막) file 관리자 2012.04.10 7428
25 [델파이 문법 시리즈] #3. 익명메소드 - 이벤트 활용,변수 바인딩 메커니즘 file 관리자 2012.04.09 7045
24 [델파이 문법 시리즈] #2. 익명메소드 - 활용, 바인딩 file 관리자 2012.04.05 7152
23 [델파이 문법 시리즈] #1. 익명메소드 - 문법 file 관리자 2012.04.04 8017
22 [델파이 문법 시리즈] #8. 제네릭 - 문법 변경 사항(마지막) file 관리자 2012.04.03 7874
21 [델파이 문법 시리즈] #7. 제네릭 - 클래스 변수, 표준함수 file 관리자 2012.04.02 6213
20 [델파이 문법 시리즈] #6. 제네릭 - 제약조건 file 관리자 2012.03.29 6905
19 [델파이 문법 시리즈] #5. 제네릭 - 메소드(파라미터,오버로드,타입 호환성) file 관리자 2012.03.28 6742
18 [델파이 문법 시리즈] #4. 제네릭 - 타입(기반,클래스,인터페이스,레코드,프로시저) file 관리자 2012.03.27 6750
17 [델파이 문법 시리즈] #3. 제네릭 - 선언 file 관리자 2012.03.26 7120
16 [델파이 문법 시리즈] #2. 제네릭 - 용어 file 관리자 2012.03.22 10016
15 [델파이 문법 시리즈] #1. 제네릭 - 개요 file 관리자 2012.03.21 13176
14 델파이 XE2 Update4의 새기능 - 더 쉬운 모바일 REST 접속 file 박병일 2012.03.06 9149
13 dbExpress 에는 TUpdateSQL 컴포넌트가 없어요! file 박병일 2012.03.05 7958
12 델파이 XE2에서 dbExpress를 이용해 오라클 연결하기 file 박병일 2012.02.15 17738
11 VCL Style을 사용하면서 Edit 콘트롤의 컬러 변경하기 file 박병일 2012.02.08 7955