我正在为我的C ++项目开发自定义轻量级UI库,并且对实现控件的行为有疑问。
当前,我有一个系统,可以从提供的文件中创建控件的实例,因此图形表示,文本,尺寸和其他参数在外部文件中定义。关于按钮和其他交互控件:我有基本的按钮类,对于每个按钮,我正在使用其自己的行为相关方法(onClick()等)实现创建派生类,请参见伪代码段:
class Button
{
public:
Button();
virtual void onClick();
};
class newButton : public Button
{
void onClick()
{}//specific implementation
};
我正在寻找一种从外部描述行为的方法(可能是脚本语言),并将其插入到编译时基本按钮的特定实例中,因此我无需创建button的子类,并且按钮/组件可以在外部文件。任何强项或建议将不胜感激。
谢谢
答案 0 :(得分:1)
好吧,我想您还有另一个XY problem:使用运行时对象多态不能解决您的愿望。尽管它使C ++代码不必关心一个特定的实现,并且可以在运行时接受新的未知解决方案,但是这些新解决方案仍必须使用C ++编译器进行编译,并且必须与基类定义和C ++实现兼容(您的像gcc或MSVC这样的编译器)运行时多态性的特定细节。
由于我假设您不希望这样做,这也很有意义,并且是在C ++世界中流行的一种模式(请参阅QML或Javascript / C ++杂种),因此您可以选择。
要么在C ++中实现所有基本的行为构建块(您当然可以在其中使用运行时多态性,甚至可以使用compile time polymorphism),然后您可以在运行时根据UI描述语言简单地将其组合在一起。要解析所谓的DSL即UI描述语言,您可以使用Boost Boost之类的库。
但是,如果您真正编写UI逻辑的脚本而不是简单地描述它,则必须设计和实现一种完整的编程语言,该语言也与C ++实现的运行时对象多态性兼容。我会发现这是一个非常艰巨的任务。
但是请不要失望,这些现成的解决方案,例如Javescript / C ++,使用native node modules,QML / Qt或lua(一种专门设计的脚本语言)以反应本机和电子的形式用于其他编程语言。