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