首先對我的代碼進行一些解釋,以便將問題放在背景關系中:
我有一個負責在螢屏上繪制東西的類,我使用多載函式來繪制不同型別的可繪制物體,函式如下所示:
draw(entityType1* name);
draw(entityType2* name);
draw(entityType3* name);
...
所有物體類都派生自父“物體”類
我寫了一個名為“Scene”的類,它有一個包含場景中所有可繪制物件的物體串列,我將該場景物件傳遞給負責在螢屏上繪制東西的類。
這個想法是遍歷串列并使用函式多載在串列中繪制不同型別的物件,但是由于串列只包含物體型別的物件,我不能真正使用函式多載,因為它只適用于兒童班
我正在尋找與此類似的代碼
void Painter::draw(Scene* scene) {
std::list<Entity*> drawables = scene->getDrawables();
for (auto it = drawables.begin(); it != drawables.end(); it ) {
draw(*it); //Should apply the correct overload
}
}
這段代碼顯然不起作用,因為我沒有任何采用物體型別的 draw() 函式。我總是可以要求物體型別針對具體情況進行處理,但這違背了擁有多載函式的目的,并打破了“告訴,不要詢問”的原則。
我可能做錯了一些非常錯誤的事情,但我真的不知道如何繼續這就是我問這個問題的原因,我想知道在尊重 OOP 原則的同時解決這個問題的正確方法是什么,可能性很廣打開,就更改我的代碼而言,一切都擺在桌面上。
提前致謝
uj5u.com熱心網友回復:
您可以使用訪問者模式來解決這個問題。此模式將函式呼叫委托給物件本身,因此您無需使用物件的型別來呼叫正確的函式。
以下是您可以如何實施它:
void Painter::draw(Scene* scene) {
std::list<Entity*> drawables = scene->getDrawables();
for (auto it = drawables.begin(); it != drawables.end(); it ) {
(*it)->accept(this); // call virtual function
}
}
// in Entity class
void Entity::accept(Painter* painter) {
painter->draw(this);
}
// in entityType1 class
void entityType1::accept(Painter* painter) {
painter->draw(this);
}
// etc...
訪問者模式的更高級實作可以在這里找到:使用 C 模板實作訪問者模式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537127.html
標籤:C 哎呀
