Integer라는 클래스와 Float라는 클래스가 있다. 두 객체 간의 덧셈을 구현하고 싶다. 몇개를 구현해야할까? 4개다. 즉, Integer + Integer, Float + Float, Integer + Float, Float + Integer이렇게 말이다. 이를 해결하기 위한 절차적 방법은 모든 상황을 거대한 case 구문에 넣는 것이다. 이것은 한군데에다가 로직을 다 넣을 수 있다는 장점이 있음에도 불구하고, 유지보수가 어렵다.
우리의 해결책은, 계산에 연관된 두 객체를 얻어오는 메세지의 계층을 추가하는 것이다.(?) 이것은 많은 메세지를 만들게 되지만, 그 복잡함의 가치가 있다.
argument에 메세지를 보내라. selector에다가 receiver의 클래스 네임을 덧붙인다. receiver를 argument로 넘긴다. 이 패턴을 사용한 후의 Integer, Float 코드는 다음과 같다.
~cpp
Integer Integer::operator+(const Number& aNumber)
{
return aNumber.addInteger(this);
}
Float Float::operator+(const Number& aNumber)
{
return aNumber.addFloat(this);
}
Integer Integer::addInteger(const Integer& anInteger)
{
return Integer(this + anInteger);
}
Float Float::addFloat(const Float& aFloat)
{
return Float(this + aFloat);
}
Float Integer::addFloat(const Float& aFloat)
{
return asFloat().addFloat(aFloat); // Integer를 Float로 바꿔준 다음 계산
}
Integer Float::addInteger(const Integer& anInteger)
{
return addFloat(anInteger.asFloat());
}
역시 완벽한 이해는 못했다. 좀 더 봐야 할듯 싶다.