E D R , A S I H C RSS

Double Dispatch

DoubleDispatch

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());
}

μ—­μ‹œ μ™„λ²½ν•œ μ΄ν•΄λŠ” λͺ»ν–ˆλ‹€. μ€ λ” 봐야 ν• λ“― μ‹Άλ‹€.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:09
Processing time 0.0121 sec