📄 testgenericconstraintconstructor.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 + -