按需跳过通用参数

时间:2014-01-21 21:07:20

标签: delphi generics

我在网上找到了这个泛型类的定义:

  TVertex<T> = class
  public
    Name: String;
    OutputAttributes: TVertexOutputAttributes;
    Marker: Boolean;
    Data: T; // User-defined data attribute
    function HasAdditionalAttributes: Boolean;
    constructor Create();
    procedure Mark;
    procedure UnMark;
  end;

使用以下代码行创建TVertex类的单个实例:

  A := TVertex<Integer>.Create();
  A.Name := 'A';

在本例中,我们将T定义为Integer数据类型。我现在的问题是:

如果我的用例不需要任何assigend数据类型T,那么如果我可以跳过数据类型的规范,那将更好/合乎逻辑。我失败了:

   A := TVertex<>.Create();
  A.Name := 'A';

为避免在创建过程中切换数据类型而进行的任何更改???

1 个答案:

答案 0 :(得分:4)

你明确要求的是一个明显的缺陷。编译器将如何处理此声明?

Data: T; // User-defined data attribute

如果您不提供T,则编译器不知道该怎么做。

这一观察引出了一种可能的方法。如果您不想提供T,那么可能您不希望该类包含此成员。如果没有提供类型,它如何包含该成员?因此,定义一个非泛型版本:

type
  TVertex = class
  public
    Name: String;
    OutputAttributes: TVertexOutputAttributes;
    Marker: Boolean;
  end;

然后从中导出您的通用版本:

type
  TVertex<T> = class(TVertex)
  public
    Data: T; // User-defined data attribute
  end;

显然,您需要确定应该在哪个类中声明和实现这些方法。显然,任何不依赖Data的方法都可以在非泛型类中实现。

相关问题