c++ - C++ 装饰器:从外部访问基类的公共函数
问题描述
我想尝试使用 C++ 装饰器,但我有一些问题。
使用这个例子:https ://gist.github.com/dlivingstone/3006324#file-decoratormain-cpp
class AbstractNPC {
public:
virtual void render() = 0;
};
class NPC: public AbstractNPC {
public:
NPC() { }
render(){...}
};
class NPCDecorator: public AbstractNPC {
private:
AbstractNPC * npc;
public:
NPCDecorator(AbstractNPC *n) { npc = n; }
void render() { npc->render(); } // delegate render to npc data member
};
class Elite: public NPCDecorator {
public:
Elite(AbstractNPC *n): NPCDecorator(n) { }
void render() {
cout << "Elite "; // render special features
NPCDecorator::render(); // delegate to base class
}
};
int main(){
AbstractNPC *goblin1= new Elite(new Shaman(new NPC("Goblin")));
...
}
我是否必须在 AbstractNPC 中将每个函数设为虚拟并将其从 NPCDecorator 重定向以从外部调用它?
class NPC: public AbstractNPC {
public:
NPC();
void render() {...}
void func1() {...}
void func2() {...}
void func3() {...}
void func4() {...}
void func5() {...}
};
int main(){
AbstractNPC *goblin1= new Elite(new Shaman(new NPC("Goblin")));
call func1(); ???
}
解决方案
这里的类NPC
应该是一个具有所有虚函数的真实实现的具体类。它可以是最小的简单 NPC,其中实现是基本逻辑,如果根本没有应用装饰器,则应使用该逻辑。请注意,它甚至没有要重定向到的指针成员。
类NPCDecorator
应该具有将所有公共接口虚拟调用重定向到其npc
指针成员的函数。
特定的装饰器喜欢Elite
并且Shaman
只需要定义它们改变行为的虚函数。如果Elite
对做什么没有影响func2
,它可以完全跳过声明和定义func2
,因为它将从基类可见NPCDecorator
。
我肯定会更改所有指向此处的指针std::unique_ptr
和所有new
表达式std::make_unique
,以避免编写手动清理代码和潜在的大量错误和令人头疼的问题。
推荐阅读
- angular - angular2出现未经授权的错误时如何使登录页面清晰可见
- c# - 模型中一个属性的多个数据库表
- logging - Windows IoT UWP 应用程序的应用程序日志记录
- swift - 快速获取在线时间
- ios - 我想在 swift 4 中以编程方式从 uiviewcontroller 导航到 uitabbarcontroller?
- sql - [datetime2](7) 的 DateDiff,采用 hh:mm;ss 格式
- android - 为什么 FileNotFoundException:在我拍照时发生?
- android - 如何使用 Twilio 邀请用户加入新创建的私人聊天频道?
- c# - 包括多个多对多集合导航属性
- r - 在 R 中子集后,'X' 必须是 Decorana/VEGAN 函数中的数字错误