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.0045 sec