== Self Delegation == 앞장에 나온 두가지 질문을 상기해보자. 위임한 객체의 주체성이 필요한가? 위임한 객체의 상태가 필요한가? 이 두가지에 yes라고 대답하면 Simple Delegation을 쓸수 없다. ---- 위임된 객체가 위임하는 객체에 접근하려면 가장 쉬운 한가지 방법이 있기는 하다. 바로 위임하는 객체의 참조를 가지고 있으면 된다. 하지만 복잡해지고, 깨질수도 있다. ---- 여기서 제시하는 방법은, 위임하는 객체를 추가적인 파라메터로 넘기는 것이다. for라는 이름의 추가적인 파라메터로 위임하는 객체를 넘기자. ---- Self Delegation의 가장 뛰어난 예제는 Visual Smalltalk 3.0의 Dictionary구현이다. Dictionary는 각각의 상태에 대해 최적화된 HashTable을 여러개 가지고 있다. 이때, 자기 자신(Dictionary)를 넘겨주게 된다. {{{~cpp class Dictionary { ... void put(const T1& keyObject, const T2& valueObject) { hashTable.put(keyObject, valueObject, this); // 문법 안맞는거 같다. 그냥 그런가 보다 하자. } }; }}} HashTable은 Collection으로 보낸 메세지가 뱉어낸 값을 기반으로 해쉬값을 계산한다. {{{~cpp void HashTable::put(const T1& keyObject, const T2& valueObject, Dictionary* collection) { hash = collection->hashOf(keyObject); ... } }}} 이제 hashOf를 폴리모피즘으로 구현할 수 있다. {{{~cpp HashTable& Dictionary::hashOf(const T& object) { return object.hash(); } HashTable& IdentityDictionary::hashOf(const T& object) { return object.basisHash(); } }}} ---- 어째 C++이 점점 미워진다. ---- [SBPPSummary]