void accept(CarElementVisitor *visitor) {
visitor->visit(this);
}
}
ここでは、操作を追加する関数にオブジェクトを渡しています。ここでは、カプセル化に違反しています。それは良いオブジェクト指向設計ですか?
void accept(CarElementVisitor *visitor) {
visitor->visit(this);
}
}
ここでは、操作を追加する関数にオブジェクトを渡しています。ここでは、カプセル化に違反しています。それは良いオブジェクト指向設計ですか?
Visitor
はアクセスされているオブジェクトの内部構造を知らないため、これがカプセル化に違反しているとは思いません。
あなたの車の例では、Car オブジェクトは 4 つの車輪とガソリン エンジンを備えていることを認識していますが、訪問者はデータの保存方法ではなく、何を伝えているかしか知りません。
void accept(CarElementVisitor *visitor) {
visitor->visit(wheel_1);
visitor->visit(wheel_2);
visitor->visit(wheel_3);
visitor->visit(wheel_4);
visitor->visit(gasEngine);
}
後で、訪問者の訪問呼び出しを変更せずに Car オブジェクトの実装を変更できます。
void accept(CarElementVisitor *visitor) {
//wheels now stored in array
visitor->visit(wheels[0]);
visitor->visit(wheels[1]);
visitor->visit(wheels[2]);
visitor->visit(wheels[3]);
visitor->visit(gasEngine);
}