⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testgenericconstraintconstructor.out

📁 格式化源码的最新板
💻 OUT
字号:
program TestGenericConstraintConstructor;

{$APPTYPE CONSOLE}

{ AFS December 2007 

  This code compiles, but is not semantically meaningfull.
  It is test cases for the code-formating utility

  Test new generics syntax - code from TridenT
}

uses
  SysUtils;

type
  TGenericSansConstructeur<T> = class
  strict private
    FData: T;
    constructor Create; // inaccessible pour la contrainte :Constructor
  public
    function GetData: T;
    procedure SetData(Value: T);
    property Data: T Read GetData Write SetData;
  end;

  TGenericAvecConstructeur<T> = class
  private
    FData: T;
  public
    constructor Create;
    function GetData: T;
    procedure SetData(Value: T);
    property Data: T Read GetData Write SetData;
  end;


  TGenericContraint<ClasseInstanciable:
constructor> = class
  private
    MaClasse: ClasseInstanciable;
  public
    constructor Create;
  end;

  MonTypeGeneric = TGenericAvecConstructeur<integer>;

  constructor TGenericSansConstructeur<T>.Create;
  begin
    inherited Create;
  end;

  function TGenericSansConstructeur<T>.GetData: T;
  begin
    Result := FData;
  end;

  procedure TGenericSansConstructeur<T>.SetData(Value: T);
  begin
    FData := Value;
  end;

  { TGenericAvecConstructeur<T> }

  constructor TGenericAvecConstructeur<T>.Create;
  begin
    inherited Create;
  end;

  function TGenericAvecConstructeur<T>.GetData: T;
  begin
    Result := FData;
  end;

  procedure TGenericAvecConstructeur<T>.SetData(Value: T);
  begin
    FData := Value;
  end;

var
  X:  TGenericSansConstructeur<string>;
  Y:  MonTypeGeneric;
  Z:  TGenericContraint<TGenericSansConstructeur<integer>>;
  Z2: TGenericContraint<TGenericAvecConstructeur<integer>>;
  Z3: TGenericContraint<TGenericAvecConstructeur<TObject>>;
  Z4: TGenericContraint<MonTypeGeneric>;

  { TGenericDerivee<ClasseInstanciable> }

  constructor TGenericContraint<ClasseInstanciable>.Create;
  begin
    inherited Create;
    //Sans la contrainte Constructor on obtient l'erreur :
    // E2076 : Forme d'appel de m閠hode autoris閑 seulement pour m閠hodes de classe
    MaClasse := ClasseInstanciable.Create;
  end;

begin
  try
    //Sans la contrainte Constructor le code suivant compile.
    //Avec la contrainte Constructor on obtient l'erreur :
    //E2513 : Le param鑤re type 'ClassInstanciable' doit avoir un constructeur sans param鑤re
    //Z := TGenericContraint<TGenericSansConstructeur<Integer>>.Create;
    //Type incompatible
    //Z := TGenericContraint<TGenericAvecConstructeur<Integer>>.Create;
    Z2 := TGenericContraint<TGenericAvecConstructeur<integer>>.Create;
    WriteLn(Z2.MaClasse.ToString);
    //Z2.Free; // Sous .NET pas n閏essaire. En Win32 la lib閞ation des ressources devra en tenir compte.
    Z3 := TGenericContraint<TGenericAvecConstructeur<TObject>>.Create;
    WriteLn(Z3.MaClasse.ToString);

    Z4 := TGenericContraint<MonTypeGeneric>.Create;
    // Ne compile pas.
    //Z4:=TGenericContraint<Y>.Create;
    WriteLn(Z4.MaClasse.ToString);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -