【Delphi】快速理解泛型(Generics)

发布于:2025-07-30 ⋅ 阅读:(17) ⋅ 点赞:(0)

Delphi的泛型(generics)是一项强大的特性,它使得代码更加灵活、类型安全,并且可以实现各种通用的数据结构和算法。下面我将为你详细介绍Delphi中的泛型,包括基本概念、语法、常用实例,以及使用建议。

Delphi的泛型(Generics)详细介绍

1. 什么是泛型(Generics)?

泛型是一种定义“模板”或“参数化类型”的技术,允许开发者在定义类、接口、方法时,将类型作为参数传入,而不是硬编码具体类型。这样可以实现一份代码适用于多种数据类型,避免重复,提高复用性和类型安全。

举个简单的类比

假设你要创建一个存放整数的容器和存放字符串的容器,若不使用泛型,需要分别写两个类;用泛型,只需一套类定义,传入不同类型即可。


2. Delphi中的泛型基本语法

定义泛型类

type
  TMyList<T> = class
  private
    FItems: array of T;
  public
    procedure Add(const Item: T);
    function Get(Index: Integer): T;
  end;
  • T 是类型参数,可以使用任何标识符(常用 TTItem 等)。
  • 在类定义中,T 被用作类型的占位符。

实现示例

procedure TMyList<T>.Add(const Item: T);
begin
  SetLength(FItems, Length(FItems) + 1);
  FItems[High(FItems)] := Item;
end;

function TMyList<T>.Get(Index: Integer): T;
begin
  Result := FItems[Index];
end;

使用示例

var
  IntList: TMyList<Integer>;
  StrList: TMyList<string>;
begin
  IntList := TMyList<Integer>.Create;
  IntList.Add(123);
  ShowMessage(IntToStr(IntList.Get(0)));

  StrList := TMyList<string>.Create;
  StrList.Add('Hello');
  ShowMessage(StrList.Get(0));
end;

3. 常用泛型类型和接口

一些标准泛型类型

  • TList<T>:动态数组实现,类似于 System.Generics.Collections.TList<T>
  • TDictionary<TKey, TValue>:字典映射。
  • TObjectList<T>:对象列表。

示例:使用 Delphi 标准库中的泛型集合

uses
  System.Generics.Collections;

var
  ListOfStrings: TList<string>;
begin
  ListOfStrings := TList<string>.Create;
  try
    ListOfStrings.Add('Delphi');
    ListOfStrings.Add('Generics');
    for var S in ListOfStrings do
      Writeln(S);
  finally
    ListOfStrings.Free;
  end;
end;

泛型接口示例

type
  IProcessor<T> = interface
    procedure Process(const Item: T);
  end;

  TPrinter<T> = class(TInterfacedObject, IProcessor<T>)
  public
    procedure Process(const Item: T);
  end;

procedure TPrinter<T>.Process(const Item: T);
begin
  // 你可以在这里实现泛型的处理逻辑
end;

4. 泛型中的特殊概念

4.1 类型约束(Constraints)

可以限制泛型参数的类型范围,常用的约束有:

  • class:限制为引用类型
  • record:值类型(结构体)
  • interface:必须实现某个接口
  • new:必须有无参数的构造函数

示例:

type
  TMyClass<T: class, constructor> = class
    // T 必须是引用类型且有无参数构造函数
  end;

5. 使用建议与注意事项

  • 使用泛型可以极大提升代码复用性,但也要注意性能(泛型本身带来一定的抽象开销)。
  • 避免过度泛型化,保持代码简洁明了。
  • 注意类型约束,确保泛型参数符合预期。

总结

特性 描述
定义 type TMyClass<T> = class ...
使用 TMyClass<Integer> 或 TMyClass<string>
优点 类型安全、减少重复、灵活扩展
常用类型 TList<T>TDictionary<TKey, TValue>
关键概念 类型参数、约束、接口


网站公告

今日签到

点亮在社区的每一天
去签到