基本上,该函数签名可以在一个地方处理不同类型的数组。如果它是用 C 语言编写的,它可能会使用宏 ( #define
) 来完成类似的事情。
从语法上讲,这<T>
意味着: T 是 arr 传递给此函数的任何对象类的占位符。如果您将 T 类型的对象传递给此函数,则在此函数中提及 T 的所有其他位置也将表示该类型。这样,如果您想处理不同的类型,就不必编写单独的函数。不过,在内部,编译器很可能会为每种类型生成单独的代码。因此,泛型是一种捷径,让您可以使用变量类型。
这将很难翻译成 Xojo,因为它没有为此提供任何方法。
由于 Xojo 不提供对泛型(模板)的支持,因此您需要找出该函数实际使用了哪些不同的数组类型,并为每种情况编写一个特定的函数。
您可以使用 Xojo 的基类Object
作为参数,尽管由于 Xojo 对数组的类型检查相当静态,因此传递 Object 数组通常不起作用。
解决这个问题的一个技巧是将数组打包成一个 Variant,然后特殊处理里面的每个数组类型。这仍然不是通用的,但至少会像原来的那样将它们全部保存在一个函数中。
像这样的东西:
Sub createObjects(arrayContainer as Variant, newAmount as Integer)
if not arrayContainer.IsArray then break ' assertion
// Handle case when array is of MyObject1
try
#pragma BreakOnExceptions off ' prevents Debugger from stopping here
dim a() as MyObject1 = arrayContainer
#pragma BreakOnExceptions default
for i as Integer = 1 to newAmount
a.Append new MyObject1
next
return
catch exc as TypeMismatchException
' fall thru
end try
// Handle more types here
break
End Sub
然后像这样调用它:
dim d() as MyObject1
createObjects d, 3