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