如何从类似的模板类构建对象

How to build objects from similar template classes

本文关键字:构建 对象      更新时间:2023-10-16

我的目标如下:

我在数据分析环境中研究蛋白质。任何给定蛋白质的可用数据都是可变的。我希望能够从更简单的父类构建一个蛋白质类。每个父类都将特定于我可用的数据层。

不同的项目可能有不同的可用数据层。我想为包含与特定数据层相关的所有变量和方法的蛋白质编写简单的类。然后,对于任何给定的项目,能够编译一个项目特定的蛋白质类,它继承了相关数据层特定的蛋白质类。

此外,每个数据层特定的蛋白质类都需要类似的数据层特定的链类、残基类和原子类。它们都是积木。原子被用来构建残基,残基被用来构建链,链被用来构建蛋白质。蛋白质类需要能够接触到它所有的原子、残基和链。同样,这些链也需要接触到残基和原子。

我已经使用向量和映射来存储指向相关对象的指针。还有相关的get和set方法。为了给每个版本的蛋白质变量和getter和setter方法,我已经为原子,残留物,链和蛋白质做了1个模板类。这个模板类包含vector和getter和setter方法,这些方法使蛋白质能够访问它的链、残基和原子。这个模板类然后被每个数据层特定的蛋白质类继承。

这是最好的方法吗?

首先,使用继承是一种很好的抽象方式,可以帮助您轻松地构建自定义类,为可重用性和维护铺平道路。不过,请花点时间考虑一下您的数据结构。使用向量似乎是使用动态数据的最自然的方式,然而,重新调整向量的大小会带来一些开销,有时在处理大数据时,这就成为一个问题。为了克服这个问题,试着找出每个人通常拥有的平均数据数量。你可以有一个数组和一个向量,只有当你用完数组的时候,你才能使用向量。这样你就不会经常碰到管理费用。根据您将要执行的实际处理,您可能需要重新考虑您的数据结构。例如,如果您的数据足够小且易于管理,则可以只使用向量并将更多精力集中在实际计算上。如果要处理的数据集很大,可能需要稍微修改一下数据结构,使处理更容易。祝你好运。

您可能希望查看复合设计模式来组织您的多级数据,并查看访问者设计模式来编写"访问"您的数据结构的算法。

复合设计模式创建了一个组件接口(抽象基类),它允许对其子层中的所有元素进行迭代,添加/删除元素等。它还应该有一个accept(some_function)方法,以允许外部算法应用于自身。然后,每个特定层(原子、残渣、链)都是派生自Component接口的具体类。不要让一个层从它的子层派生:继承应该只反映一个"is-a"关系,除非在非常特殊的情况下。

访问者设计模式创建了一个算法层次结构,它独立于数据的精确结构。如果数据的类层次结构在可预见的将来不会改变,则此模式最有效。[注:你仍然可以用你的特定数据填充结构来得到任何你想要的分子,只是不要改变结构中的层数]。

无论您做什么,总是建议仅使用继承来重用或扩展接口,并使用组合来重用/扩展数据。例如,像vectormap这样的STL容器没有虚析构函数,也没有被设计成用作基类。