2016-09-14 75 views
2

我将map(),reduce()和where(qlint:string)添加到了我的Spring4D分支。 当我编程这些函数时,我发现列表的行为有不同,当它们以不同的方式创建时。我为什么要使用TCollections.CreateList <T>而不是TList <T>。创建

如果我用TList<TSomeClass>.create创建它们,枚举类型中的对象的类型为TSomeClass

如果我用TCollections.CreateList<TSomeClass>创建它们,枚举类型中的对象的类型为TObject

所以,问题是:

是否有一个缺点用TList<TSomeClass>.create
或换句话说:我为什么要用TCollections.CreateList<TSomeClass>


BTW:与TCollections.CreateList我有一个TObjectList而不是从TList。所以它应该被称为TCollections.CreateObjectList ...但这是另一回事。

+1

不符合。 'TCollections.CreateList '返回'IList '。当你枚举这些项目是“TSomeClass”类型的。换句话说,我质疑你在帖子中声称的所有内容。 –

+0

至于直接使用'TList '的缺点,我认为如果你曾经参考一个它实现的接口,这将会变得很明显。在这一点上,生命周期管理将被接口引用接管,并且您可能会发现它从下面消失。因此,使用'CreateList '并且按住'IList '或'IEnumerable '而不是执行类。这个库的原理之一就是你不需要知道实现的细节。但是,我对Spring4d知之甚少,所以我可以在这里得到完全错误的结果...... –

+0

这是很糟糕的解释。不同之处仅在于“可数”。我正在编写一些新的实习生函数给'TEnumerable'。在我的新函数中,RTTI调用的行为有所不同,因为我使用的是枚举类型的泛型类型(我知道从一开始就是错误的,但很容易从头开始)。对于刚上课的人来说,没有什么不同。 – Benedikt

回答

11

根据编译器版本的不同,许多Spring.Collections.TCollections.Create方法正在应用编译器无法做到的事情:将实现折叠为仅仅很细的泛型类。有些方法是从XE开始的,有些只是在XE7之后才有的(GetTypeKind内部函数可以在编译时进行类型分辨率 - 例如参见无参数TCollections.CreateList<T>)。

如果您创建许多不同类型的IList<T>(其中T是类或接口),因为它将它们折叠为TFolded(Object|Interface)List<T>,这会大大减少二进制大小。但是通过界面,您可以按照您指定的项目访问项目,并且ElementType属性也会返回正确的类型,而不仅仅是TObjectIInterface。在柏林它为每个不同的目标列表增加不到1K,而如果由于所有涉及不同操作的内部类可以调用IList<T>而不应用折叠,它将增加80K左右。

至于TCollections.CreateList<T>返回一个IList<T>当T是一个完全按照设计的类时,支持TFoldedObjectList<T>。由于OwnsObject作为False通过,它具有与TList<T>完全相同的行为。

Spring4D集合是基于接口的,所以只要接口的行为相应地接口后面的类是什么都没有关系。

请确保您仅将列表附带在IList<T>而不是TList<T> - 您可以两种方式创建它们(使用TCollections方法时我提到过的优点)。在我们自己的应用程序中,有些地方仍在使用类的构造函数,而其他许多地方正在使用来自Spring.Collections.TCollections的静态方法。

BTW:

我看到了活动的叉子和国际海事组织也没有必要实现的Map/Reduce,因为这是已经存在。由于Spring4D集合是以后建模的。他们被称为SelectAggregate(见Spring.Collections.TEnumerable)。它们不直接在IEnumerable<T>上提供,因为接口不能有通用的参数化方法。

+0

感谢您对“选择”和“聚合”的提示。那delphi不允许在接口中使用通用的参数化方法,但也给我带来了一些麻烦。这就是为什么我打开了四个默认地图(),我可以通过IEnumerable 使用。我想我必须做一些关于delphi编译器如何工作的功课。 – Benedikt

+0

btw:对不起,我没有看到列表被创建与“OwnsObject = False”。那是我的错。所以你的命名是对的:) – Benedikt

相关问题