Dispatched Interpretation ¶
μΈμ½λ©μ νλ‘κ·Έλλ°μ μμ΄μ νμμ μ΄λ€. λ°μ΄ν°κ° κ³μ°μΌλ‘λΆν° λΆλ¦¬λμ΄ μλ κ³Όκ±°μλ, μΈμ½λ© μμ
μ λ§€μ° μ€μνλ€. μμ¬λ¦¬ νλ² λ΄λ©΄ λ κ²λ λ§μ΄ λ€μλ€. νμ§λ§ κ°μ²΄μ§ν₯ μλμλ μ’ λ€λ₯΄λ€. μΈμ½λ©μ λλ²μ§Έλ‘ λ°λ €λκ³ κ°μ²΄λ€ μ¬μ΄μ μ±
μμ λΆλ°°νλ κ²μ΄ κ°μ₯ μ€μνκ² λ κ²μ΄λ€. μμ§μ¬μ§ OO νλ‘κ·Έλ¨μλ, μ΄λ ν μ 보μ κ΄μ¬μ κ°μ§λ κ°μ²΄κ° νλλ°μ μμ΄μΌ νλ€. κ·Έ κ°μ²΄λ μμ μ μ 보μ μ§μ μ κ·Όνκ³ , μλ°νκ² μΈμ½λ©κ³Ό λμ½λ©μ μννλ€.
κ·Έ.λ¬.λ. κ°μ²΄μ μ λ³΄κ° λ€λ₯Έ κ°μ²΄μ μν₯μ λ―Έμ³μΌλ§ ν λκ° μλ€. κ°λ¨ν λλ, κ·Έλ₯ μΈμ½λ©λ μ€λΈμ νΈμ λ©μΈμ§λ₯Ό 보λ΄λ©΄ μμνκ² ν΄κ²°μ΄ κ°λ₯νλ€. νμ§λ§ 볡μ‘ν κ²½μ°μλ νλ€λ€. λ¬Έμ λ μλ°±μ ν΄λΌμ΄μΈνΈλ€μκ² λͺ¨λ νμ
μ μ 보μ λν΄ λͺ
μμ μΌλ‘ case ννμ ꡬ쑰λ₯Ό λ§λ€κΈ°λ₯Ό μνμ§ μλλ€λ κ²μ΄λ€.(??)
μμ μ½λλ‘ μ΄ν΄νλ κ²μ΄ λΉ λ₯΄λ€. Shape κ°μ²΄λ line, curve, stroke, fill 컀맨λλ€μ μμ°¨μ μΈ μ‘°ν©μΌλ‘ μ΄λ£¨μ΄μ Έ μλ€. μ΄κ²μ commandAt(int)λΌλ nλ²μ§Έ 컀맨λλ₯Ό 리ν΄ν΄μ£Όλ λ©μΈμ§μ, argumentsAt(int)λΌλ 컀맨λμ λκ²¨μ€ μΈμλ€μ λ°°μ΄μ 리ν΄ν΄μ£Όλ λ©μΈμ§λ₯Ό μ 곡ν΄μ€λ€.
~cpp class PostScriptShapePrinter { public: void display(Shape& aShape) { for(int i = 0 ; i < aShape.size() ; ++i) { void* command = aShape.commandAt(i); // λ¬Έλ² λ§λ?--; Arguments& argument = aShape.argumentsAt(i); if(command == lineFunc) { printPoint(argument.at(1)); space(); printPoint(argument.at(2)); space(); nextPutAll("line"); } else if(command == curveFunc) /* ... */ } } };μμ μ½λλ₯Ό 보면 μκ² μ§λ§, CURVE λ€μμλ STROKE, FILL λ±μ΄ κ³μ λμ¬ κ²μ΄λ€. μ¦, case ꡬ쑰λ₯Ό μμΌλ‘μ¨, OAOOμ μμΉμ μλ°νκ³ μλ€. μ΄μ μ°λ¦¬λ case κ΅¬μ‘°κ° μΈμ½λ©λ κ°μ²΄ μμ μ¨κ²¨μ§λλ‘ νλ ν΄κ²°μ± μ΄ νμνλ€.
λͺ¨λ 컀맨λλ₯Ό μν case ꡬ문μ μ°μ§ λ§κ³ , PostScriptShapePrinterμ λͺ¨λ 컀맨λλ₯Ό λμ.
~cpp void PostScriptShapePrinter::line(Point& from, Point& to) { printPoint(from); space(); printPoint(to); space(); nextPutAll("line"); } void PostScriptShapePrinter::curve(/* ... */) { /* ... */ } /* ... */
λν, commantAtμ΄λ argumentAtκ°μ λ©μΈμ§ λ§κ³ , sendCommand(at,to) κ°μ λ©μΈμ§λ₯Ό μ 곡νμ. μμ line,curveλ μ΄κΌ΄μ΄λ―λ‘ κ°μ΄ λ€λ£°μ μλ€.
~cpp void PostScriptShapePrinter::display(Shape& aShape) { for(int i = 0 ; i < aShape.size() ; ++i) { aShape.sendCommand(i,this); } }μ λ©μλλ Shapeλ‘ κ°λκ² μ’μ λ―νλ€.
~cpp void Shape::sendCommandTo(Object& anObject) { for(int i = 0 ; i < size() ; ++i) { sendCommand(i,object); } }κ·Έλ¬λ©΄ μ΄λ κ² κ°λ¨ν΄μ§λ€.
~cpp void PostScriptShapePrinter::display(Shape& aShape) { aShape.sendCommandTo(this); }
μ 리ν΄λκ³ λ³΄λ... λ¬΄μ¨ λ§μΈμ§ λͺ¨λ₯΄κ² λ€.--; μμ΄λ λ€μ μ°κ΄κ΄κ³κ° μλΉν λ¨μ΄μ§λ€. λ³ΈμΈμ ν΄μμ΄ λΆμ‘±ν νμ΄λ€. λΉ λ₯Έ μμΌ λ΄μ 보κ°ν΄μ μ¬λ¦¬κ² λ€.