变体与继承
Variant vs Inheritance
假设我正在为某种编程语言编写编译器。通常使用抽象语法树 (AST) 作为内部表示。我可以看到两种可能的设计方式:
- 使用
boost::variant
- 使用继承
由于节点的层次结构是固定的 - boost::variant
就足够了。
我的问题是,从可维护性和运行时效率的角度来看,每种方法的优缺点是什么?
使用 boost::variants
会起作用,但需要您广泛使用访问者模式来利用变体对象的内容。如果稍后您扩展变体中使用的类型数量,则必须维护已实现的所有访问者。
有了继承,您就有了使用多态性的优势。以后的扩展将很简单:只需派生现有基类之一并覆盖多态函数,而无需触及其余代码。
假设我正在为某种编程语言编写编译器。通常使用抽象语法树 (AST) 作为内部表示。我可以看到两种可能的设计方式:
- 使用
boost::variant
- 使用继承
由于节点的层次结构是固定的 - boost::variant
就足够了。
我的问题是,从可维护性和运行时效率的角度来看,每种方法的优缺点是什么?
使用 boost::variants
会起作用,但需要您广泛使用访问者模式来利用变体对象的内容。如果稍后您扩展变体中使用的类型数量,则必须维护已实现的所有访问者。
有了继承,您就有了使用多态性的优势。以后的扩展将很简单:只需派生现有基类之一并覆盖多态函数,而无需触及其余代码。