Open changhwan77 opened 3 months ago
[ 해결책 3 구현 기록 ]
Node라는 인터페이스(빈 껍데기)를 만들고 menuItem과 DessertMenu가 구현.
class MenuItem : public Node {
private:
string name;
string description;
bool vegetarian;
double price;
upcasting을 활용하기 위해 다른 부분에서도 데이터 타입을 Node 포인터로 변경.
클라이언트해서 해당 인터페이스를 사용하려고 했으나...
그럼 MenuItem과 Menu(반복자 생성) 클래스의 역할이 인터페이스로 추상화되어 두 역할이 섞이게 되는 문제 발생.
class Waitress {
private:
vector<Menu*> menus;
public:
Waitress(vector<Menu*> &menus) { this->menus = menus; }
void printMenu() {
cout << "메뉴 출력" << endl;
for (auto menu : menus) {
Iterator* menuIterator = menu->createIterator();
while(menuIterator->hasNext()) {
Node* menuItem = menuIterator->next();
// Node에 인터페이스(menu의 이름 받아오는 추상 메서드)가 있어야 되는데
// DesserMenu의 경우에는 해당 역할을 받으면 안됌.
cout << menuItem->getName() << endl;
}
}
}
다른 솔루션 모색.
[ 해결 기록 ]
class MenuComponent {
public:
virtual string getName() = 0;
virtual string getDescription() = 0;
// MenuItem과 Menu에서 필요한 메서드만 상속해서 사용하기 위한 장치
// 함수 body가 빈 값이면 { } 컴파일 에러 발생.
virtual double getPrice() {
throw logic_error("getPrice()는 이 객체에서 사용할 수 없습니다.");
};
virtual bool isVegetarian() {
throw logic_error("isVegetarian()는 이 객체에서 사용할 수 없습니다.");
};
virtual void print() {
throw logic_error("print()는 이 객체에서 사용할 수 없습니다.");
}
virtual void add(MenuComponent* menuComponent) {
throw logic_error("add()는 이 객체에서 사용할 수 없습니다.");
}
virtual void remove(MenuComponent* menuComponent) {
throw logic_error("remove()는 이 객체에서 사용할 수 없습니다.");
}
virtual MenuComponent* getChild(int position) {
throw logic_error("getChild()는 이 객체에서 사용할 수 없습니다.");
}
};
💡 작업 내용
🤔 해결책
✏️ 참고 사항