Delphi TCollectionItem的继承

Delphi TCollectionItem的继承,delphi,inheritance,parameters,tcollectionitem,Delphi,Inheritance,Parameters,Tcollectionitem,我计划将项目集合存储在一个TCollection中 每个项目将派生自TBaseItem,后者又派生自TCollectionItem 记住这一点,当请求一个项目时,集合将返回TBaseItem 现在,每个TBaseItem将有一个Calculate函数,在TBaseItem中,这将只返回一个内部变量,但在TBaseItem的每个派生中,Calculate函数需要一组不同的参数 集合将有一个Calculate All函数,该函数遍历集合项并调用每个Calculate函数,显然它需要将正确的参数传递给

我计划将项目集合存储在一个TCollection中

每个项目将派生自
TBaseItem
,后者又派生自TCollectionItem

记住这一点,当请求一个项目时,集合将返回
TBaseItem

现在,每个
TBaseItem
将有一个
Calculate
函数,在
TBaseItem
中,这将只返回一个内部变量,但在
TBaseItem
的每个派生中,
Calculate
函数需要一组不同的参数

集合将有一个
Calculate All
函数,该函数遍历集合项并调用每个
Calculate
函数,显然它需要将正确的参数传递给每个函数

我可以想出三种方法:

  • 为基类中的每个计算函数创建一个虚拟/抽象方法,并在derrive类中重写它,这意味着在使用对象时不需要类型转换,但这也意味着我必须创建许多虚拟方法,并有一个大的if…else语句来检测类型并调用正确的“calculate”方法,这也意味着调用calculate方法容易出错,因为在编写代码时,您必须知道使用正确的参数为哪种类型调用哪种方法,以避免出现错误/EAbstractError

  • 创建一个包含中所有可能参数的记录结构,并将其用作“计算”函数的参数。这样做的另一个好处是将其传递给“calculate all”函数,因为它可以包含所需的所有参数,并避免可能非常长的参数列表

  • 只需键入TBaseItem即可访问正确的计算方法。与第一种方法相比,这将使TBaseItem更加整洁


  • 处理此集合的最佳方法是什么?

    如果它们都有不同的方法签名,那么使用虚拟方法并不能真正获得任何东西-它们也可能是静态的。我会支持一组“通用”/“规范”的参数,如案例2中的参数,以及虚拟/重写的计算方法,至少根据您目前给出的描述。

    集合实际上不是设计用于多态性的。默认集合编辑器始终创建相同类型的项,即传递给集合构造函数的类型。如果不打算从表单设计器编辑集合的内容,则不要从TCollection开始。使用其他一些容器类,比如TObjectList,甚至是你自己的TObject的直接子类。问题更多的是将不同的参数从不同的子代传递给同一个方法。