이번에는 파티 기능에 관해 시퀀스 다이어그램을 작성하고 난 후에 구체적인 코드를 구현합시다.
파티 기능은 다운타운에 있는 모든 학생의 Drink을 수행합니다. 그런데 각 장소에서는 해당 장소에서 명령할 수 있는 기능만 보이게 한정하였기 때문에 IPlay 인터페이스 형식으로 학생 개체에 접근해야 합니다.
그리고 IPlay 인터페이스에 Drink 메서드를 순수 가상 메서드로 약속하세요.
interface IPlay { virtual void Drink()=0; };
다운타운의 Party 기능을 구현합시다.
void Downtown::Party()//파티 { cout<<"파티"<<endl; 먼저 학생 수를 구하여 반복합니다. size_t max = GetCount();//학생 수 구하기 for(size_t index = 0; index<max; ++index) { 다운타운에서 학생에게 명령할 수 있는 기능은 IPaly 인터페이스에 약속하였습니다. 따라서 특정 인덱스의 개체를 IPlay *로 하향 캐스팅을 합니다. IPlay *iplay = dynamic_cast<IPlay *>(GetAt(index)); if(iplay) { IPlay 인터페이스의 멤버 Drink 메서드를 호출합니다. iplay->Drink(); } else { 만약 하향 캐스팅을 할 수 없으면 프로그램에 버그가 있는 것이므로 예외를 던집니다. throw "장소에 있는 개체가 IPlay 형식으로 하향 캐스팅을 할 수 없습니다."; } } }
학생 클래스에 Drink을 가상 메서드로 변경하고 누가 음료를 마시는지 출력합시다.
class Student:public Man, public IStudy, public IRelax, public IPlay { ...중략... public: ...중략... virtual void Drink(); ...중략... };
Student 클래스의 Drink 메서드에서는 누가 음료를 마시는지 출력합시다.
void Student::Drink() { cout<<GetName()<<" 음료를 마시다."<<endl; }
그리고 학사 학생, 마법 학생, 운동 학생의 Drink에서는 Student 클래스의 Drink 메서드를 호출하는 부분을 추가하세요.
void SStudent::Drink() { Student::Drink(); ...중략... }
void MStudent::Drink() { Student::Drink(); ...중략... }
void PStudent::Drink() { Student::Drink(); ...중략... }
이제 컴파일 및 빌드하신 후에 테스트를 해 보세요.