それを元に、コードを組んだのですが、随分オープンなコードになってしまいました。
こういったコードを必要な部分だけが見れる様に、カプセル化するにはどうしたらいいでしょうか。
また、そもそもカプセル化とは何なのかが判りません、コードを内部結合にするだけでカプセル化になるのでしょうか。教えてください。
#include<iostream>
enum SequenceType{ NONE, START_MENU, MAIN_GAME };
SequenceType order=NONE;
void SendOrder(SequenceType order){ ::order = order; };
class Sequence{
public:
virtual ~Sequence(){}
virtual void Update() = 0;
virtual void Draw() = 0;
};
class MainGame:public Sequence{
public:
MainGame(){}
~MainGame(){}
void Update(){}
void Draw(){ std::cout << "MainGame\n"; }
};
class StartMenu :public Sequence{
enum MenuItem{ LOAD_GAME,NUM };
MenuItem SelectedItem;
public:
StartMenu():SelectedItem(LOAD_GAME){}
~StartMenu(){}
void Update()
{
char input;
std::cin >> input;
switch (input){
case'w': SelectedItem = static_cast<MenuItem>((SelectedItem + (NUM - 1)) % NUM); break;
case's': SelectedItem = static_cast<MenuItem>((SelectedItem + 1) % NUM); break;
case'd':
switch (SelectedItem){
case LOAD_GAME:SendOrder(MAIN_GAME); break;
}
}
}
void Draw(){ std::cout << "StartMenu\n"; }
};
//処理ごとにあった分岐のswitch文を1つにまとめる
class PraimaryManager{
Sequence* seq;//機能の一部をSequenceに委譲
public:
PraimaryManager() :seq(new StartMenu){ ; }
~PraimaryManager(){ delete seq; }
void Update()
{
if (order != NONE){
delete seq;
switch (order){
case START_MENU:; seq = new StartMenu; break;
case MAIN_GAME:; seq = new MainGame; break;
}
order = NONE;
}
seq->Update();//SendOrderはここでで呼ばれ、1ループ後に上にあるメソッドで処理される。
}
void Draw(){ seq->Draw(); };
};
int main(){
PraimaryManager pm;
for (int i = 0; i < 10; ++i){
pm.Update();
pm.Draw();
}
}