위임(개체 지향 프로그래밍)
Delegation (object-oriented programming)오브젝트 지향 프로그래밍에서 위임은 다른 원래 오브젝트(송신자)의 컨텍스트에서 한 오브젝트(수신자)의 멤버(속성 또는 메서드)를 평가하는 것을 말합니다.위임을 명시적으로 실행할 수 있습니다.송신 오브젝트를 수신 오브젝트에 건네주는 것은 임의의 오브젝트 지향 언어로 실행할 수 있습니다.또, 암묵적으로, 기능의 서포트가 필요한 언어의 멤버룩업 룰에 의해서도 실행할 수 있습니다.암묵적 위임은 클래스 기반 프로그래밍의 상속과 일치하는 프로토타입 기반 프로그래밍에서 동작을 재사용하기 위한 기본 방법입니다.언어 수준에서 위임을 지원하는 가장 잘 알려진 언어는 Self와 JavaScript입니다. 이 언어는 셀프 호출에 대한 메서드 검색 시 사용되는 가변 부모 슬롯 개념을 통합합니다. JavaScript 위임을 참조하십시오.
위임이라는 용어는 개체 간의 다양한 다른 관계에도 느슨하게 사용됩니다. 자세한 내용은 위임(프로그래밍)을 참조하십시오.자주 혼동되는 개념은 단순히 다른 오브젝트(더 정확히는 컨설팅 또는 집약)를 사용하는 것입니다.또한 다른 오브젝트에 대응하는 멤버를 평가함으로써 한 오브젝트상의 멤버를 평가하는 것입니다.특히, 수신 오브젝트의 컨텍스트에서는, 포워딩이라고 불립니다(랩퍼 오브젝트가 통과하지 않는 경우).래핑된 오브젝트)[1][2][a]에 대응합니다.위임 패턴은 위임을 구현하기 위한 소프트웨어 설계 패턴이지만 이 용어는 협의 또는 전송에도 느슨하게 사용됩니다.
개요
이른바 셀프콜을 디스패치하기 위한 메서드 룩업 규칙을 사용하는 프로그래밍 언어 기능으로서의 위임감은 Lieberman이 1986년 발표한 논문 "Using Protopical Objects to Implemented with Shared Behavior in Object-Oriented Systems"에서 정의했습니다.
위임은 동적 바인딩에 의존합니다.이는 특정 메서드콜이 실행 시 다른 코드[citation needed] 세그먼트를 호출할 수 있어야 하기 때문입니다.macOS(및 이전 NeXTStep) 전체에서 프로그램 [3]구성 요소의 동작을 사용자 지정하는 수단으로 사용됩니다.이를 통해 단일 OS 제공 클래스를 사용하여 창을 관리하는 등의 구현이 가능합니다. 이 클래스는 프로그램 고유의 위임자를 사용하며 필요에 따라 기본 동작을 재정의할 수 있기 때문입니다.예를 들어 사용자가 닫기 상자를 클릭하면 창 관리자가 위임자에게 창을 보냅니다.Should Close: 호출, 창 내용으로 표시되는 저장되지 않은 데이터가 있는 경우 대리인은 창 닫기를 지연시킬 수 있습니다.
위임은 다음과 같이 [4]자기 지연 바인딩으로 특징지을 수 있습니다(및 전송과 구별됩니다).
에 송신된 메시지
self
(또는this
부모 변수)는 메시지를 처음 수신한 개체로 "돌아옵니다".
즉,self
수신 객체의 메서드 정의에서는 정의 시(예를 들어 컴파일 시간 또는 함수가 객체에 부가될 때)에 해당 객체에 정적으로 바인딩되지 않고 평가 시 원래 객체에 바인딩됩니다.
경우에 따라서는 프로그램 코드를 보다 [5]읽기 쉽고 이해하기 쉽게 하기 위해 상속보다 위임을 선호할 수 있다는 주장이 제기되어 왔다.명시적 위임이 상당히 광범위하지만, 상대적으로 소수의 주요 프로그래밍 언어만이 위임을 상속의 대안 모델로 구현합니다.위임과 상속 간의 정확한 관계는 복잡하다. 일부 저자는 위임을 동등하게 여기거나, 다른 [6]저자의 특수한 경우로 간주한다.
위임 언어 지원
메서드 룩업규칙을 통한 위임을 지원하는 언어에서 메서드 디스패치는 상속의 가상 메서드에 대해 정의된 방식으로 정의됩니다.이는 항상 메서드 검색 중에 가장 구체적인 메서드입니다.따라서 메서드 룩업이 (오브젝트 참조가 아닌 위임 링크를 통해) 다른 오브젝트에 제어를 넘긴 경우에도 메서드룩업의 시작인 것은 원래 리시버 엔티티입니다.
위임은 런타임에 수행될 수 있고 특정 유형의 엔티티 하위 집합에만 영향을 줄 수 있으며 런타임에도 제거할 수 있다는 장점이 있습니다.반면 상속은 일반적으로 인스턴스가 아닌 유형을 대상으로 하며 컴파일 시간으로 제한됩니다.한편 상속은 정적으로 체크할 수 있지만 위임은 일반적으로 제네릭이 없으면 체크할 수 없습니다(단, 제한된 버전의 위임은 정적으로 타이프할[7] 수 있습니다).위임은 "특정 개체에 대한 런타임 상속"이라고 할 수 있습니다.
다음으로 C#/Java와 같은 언어의 의사 코드의 예를 나타냅니다.
학급 A { 무효 후우() { // 다른 언어로 "current", "me" 및 "self"라는 이름으로도 "this"가 표시됨 이것..막대기(); } 무효 막대기() { 인쇄물("a.bar"); } }; 학급 B { 사적인 위임하다 A a; // 위임 링크 일반의 B(A a) { 이것..a = a; } 무효 후우() { a.후우(); // a-module의 foo()를 호출합니다. } 무효 막대기() { 인쇄물("b.bar"); } }; a = 신규 A(); b = 신규 B(a); // 두 개체 간에 위임 설정
부르기b.foo()
b.bar가 인쇄됩니다.this
원래 수신기 개체를 참조합니다.b
의 컨텍스트 내에서a
그 결과 발생하는 모호성this
대상 정신분열증이라고 합니다
암묵적인 번역this
명시적인 파라미터로 콜을 변환한다(in)B
,와 함께a
대표자)a.foo()
로 변환됩니다.A.foo(b)
의 유형을 사용하여a
메서드 해결의 경우이지만 위임 개체는b
를 위해this
논쟁.
상속을 사용하면 다음과 같은 유사한 코드(해상도 객체가 아닌 클래스에 기반함을 강조하기 위해 대문자 사용):
학급 A { 무효 후우() { 이것..막대기(); } 무효 막대기() { 인쇄물("A.bar"); } }; 학급 B 확장 A { 일반의 B() {} 무효 후우() { 잘 하는 군요.후우(); // 슈퍼클래스(A)의 foo()를 호출합니다. } 무효 막대기() { 인쇄물("B.bar"); } }; b = 신규 B();
부르기b.foo()
B.bar 가 됩니다.이 경우,this
모호하지 않다: 단일 객체가 있다.b
,그리고.this.bar()
는 서브클래스의 메서드로 해결됩니다.
일반적으로 프로그래밍 언어에서는 언어 개념으로서 이 특이한 형태의 위임을 지원하지 않지만 몇 가지 예외가[citation needed] 있습니다.
이중 상속
언어가 위임과 상속을 모두 지원하는 경우 두 메커니즘을 동시에 사용하여 이중 상속을 수행할 수 있습니다.
학급 C 확장 A { 위임 링크 D d; }
(2개의 룩업패스에 의해) 가장 구체적인 것으로 나타낼 수 있는2개의 메서드가 존재할 가능성이 있기 때문에 메서드룩업에 대한 추가 규칙이 필요합니다.
관련 영역
위임을 엔티티 간에 코드와 데이터를 공유하는 하위 수준의 메커니즘으로 설명할 수 있습니다.따라서 그것은 다른 언어구조를 위한 기반을 구축한다.특히 역할 지향 프로그래밍 언어는 위임을 이용하고 있지만, 특히 오래된 언어들은 위임을 사용한다고 주장하면서 사실상 집계를 사용했습니다.이것은 부정행위로 간주되어서는 안 됩니다.위임이 의미하는 복수의 정의일 뿐입니다(위에서 설명한 바와 같습니다).
최근에는 위임을 분산하는 작업도 이루어지고 있기 때문에 검색 엔진의 클라이언트(저렴한 호텔 객실 검색)는 위임을 사용하여 공유 엔티티를 사용하여 베스트 히트 및 일반적인 재사용 기능을 공유할 수 있습니다.
2003년 Ernst와 Lorenz에 의해 애스펙트 지향 프로그래밍에 대한 조언 해결을 위한 위임도 제안되었다.
「 」를 참조해 주세요.
구별:
메모들
- ^ Beck 1997 에서는, 수신 오브젝트가 송신 오브젝트에 액세스 할 수 없는 경우는 「단순 위임」, 수신 오브젝트가 송신 오브젝트에 액세스 할 수 있는 경우는 「자기 위임」이라고 하는 용어를 사용합니다.현대의 언어에서는, 이 문서에서 사용되고 있는 「전송」과 「위임」이 있습니다.
레퍼런스
- ^ Gamma et al. 1995, "위임", 페이지 20-21.
- ^ 1997년 벡, "위임", 페이지 64-69.
- ^ Apple (2009-08-20). "Cocoa Fundamentals Guide: Delegates and Data Sources". Apple Developer Connection. Retrieved 2009-09-11.
- ^ "Intersecting Classes and Prototypes". Perspectives of Systems Informatics: 5th International Andrei Ershov Memorial Conference, PSI 2003, Akademgorodok, Novosibirsk, Russia, July 9-12, 2003, Revised Papers. p. 38.
- ^ [1]Trygve Reenskaug, 오슬로 대학 정보학부, "읽을 수 있는 코드 사례"(2007)
- ^ Stein, Lynn Andrea. Delegation is Inheritance. OOPSLA '87 Conference proceedings on Object-oriented programming systems, languages and applications. pp. 138–146. doi:10.1145/38807.38820.
- ^ Günter Kniesel (1999-11-19). "Type-Safe Delegation for Run-Time Component Adaptation". ECOOP' 99 — Object-Oriented Programming. Lecture Notes in Computer Science. Vol. 1628. Springer. pp. 351–366. CiteSeerX 10.1.1.33.7584. doi:10.1007/3-540-48743-3_16. ISBN 978-3-540-66156-6. Archived from the original on 1999-11-19. Retrieved 2015-03-04.
This paper proposes object-based inheritance (also known as delegation) as a complement to purely forwarding-based object composition. It presents a typesafe integration of delegation into a class-based object model and shows how it overcomes the problems faced by forwarding-based component interaction, how it supports independent extensibility of components and unanticipated, dynamic component adaptation.
- Lieberman, Henry (1986). "Using prototypical objects to implement shared behavior in object-oriented systems". Conference proceedings on Object-oriented programming systems, languages and applications. ACM SIGPLAN Notices. Vol. 21. Portland. pp. 214–223. CiteSeerX 10.1.1.48.69. doi:10.1145/960112.28718.
- Lynn Andrea Stein, Henry Liberman, David Ungar: 공유에 대한 공통된 견해: 올란도 조약.인: 원킴, 프레데릭 H. 록호프스키(Eds): 객체 지향 개념, 데이터베이스, 응용 프로그램, ACM Press, 뉴욕, 1989, 3장, 31-48 ISBN 0-201-14410-7 (씨티서 온라인)
- Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1995). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. ISBN 978-0-201-63361-0.
- Malenfant, J:위임 기반 프로그래밍 언어의 의미 다양성, OOPSLA95의 진행, 뉴욕: ACM 1995, 페이지 215-230.
- Beck, Kent (1997). Smalltalk Best Practice Patterns. Prentice Hall. ISBN 978-0134769042.
- Kasper Bilsted Graversen:역할의 성질-언어 구성으로서의 역할 분류학적 분석.2006년 박사논문 (코겐 IT대학 온라인)
외부 링크
- C++에서 대리인을 구현하는 새로운 방법
- C++에서의 신속한 위임
- Perfect JPattern 오픈 소스 프로젝트. Java에서 대리인을 재사용할 수 있습니다.