|
@@ -0,0 +1,176 @@
|
|
|
|
+{ %NORUN }
|
|
|
|
+
|
|
|
|
+{ type helpers in mode ObjFPC can also be used in place of record and class
|
|
|
|
+ helpers }
|
|
|
|
+
|
|
|
|
+program tthlp23;
|
|
|
|
+
|
|
|
|
+{$mode objfpc}
|
|
|
|
+{$modeswitch advancedrecords}
|
|
|
|
+{$modeswitch typehelpers}
|
|
|
|
+
|
|
|
|
+type
|
|
|
|
+ TTest = record
|
|
|
|
+ function Test: LongInt;
|
|
|
|
+ class function TestStatic: LongInt; static;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TTestHelper = type helper for TTest
|
|
|
|
+ function Test: LongInt;
|
|
|
|
+ class function TestStatic: LongInt; static;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TTestHelperSub = type helper(TTestHelper) for TTest
|
|
|
|
+ function Test: LongInt;
|
|
|
|
+ class function TestStatic: LongInt; static;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TObjectHelper = type helper for TObject
|
|
|
|
+ function Test: LongInt;
|
|
|
|
+ class function TestClass: LongInt;
|
|
|
|
+ class function TestStatic: LongInt; static;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TObjectHelperSub = type helper(TObjectHelper) for TObject
|
|
|
|
+ function Test: LongInt;
|
|
|
|
+ class function TestClass: LongInt;
|
|
|
|
+ class function TestStatic: LongInt; static;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TObjectSub = class(TObject)
|
|
|
|
+ function Test: LongInt;
|
|
|
|
+ class function TestClass: LongInt;
|
|
|
|
+ class function TestStatic: LongInt; static;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ TObjectSubHelperSub = type helper(TObjectHelper) for TObjectSub
|
|
|
|
+ function Test: LongInt;
|
|
|
|
+ class function TestClass: LongInt;
|
|
|
|
+ class function TestStatic: LongInt; static;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+function TTest.Test: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 1;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TTest.TestStatic: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 2;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TTestHelper.Test: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 3;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TTestHelper.TestStatic: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 4;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TTestHelperSub.Test: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 5;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TTestHelperSub.TestStatic: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 6;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TObjectHelper.Test: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 7;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TObjectHelper.TestClass: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 8;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TObjectHelper.TestStatic: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 9;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TObjectHelperSub.Test: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 10;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TObjectHelperSub.TestClass: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 11;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TObjectHelperSub.TestStatic: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 12;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TObjectSub.Test: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 13;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TObjectSub.TestClass: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 14;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TObjectSub.TestStatic: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 15;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TObjectSubHelperSub.Test: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 16;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TObjectSubHelperSub.TestClass: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 17;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+class function TObjectSubHelperSub.TestStatic: LongInt;
|
|
|
|
+begin
|
|
|
|
+ Result := 18;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+var
|
|
|
|
+ t: TTest;
|
|
|
|
+ o: TObject;
|
|
|
|
+ os: TObjectSub;
|
|
|
|
+begin
|
|
|
|
+ if t.Test <> 5 then
|
|
|
|
+ Halt(1);
|
|
|
|
+ if t.TestStatic <> 6 then
|
|
|
|
+ Halt(2);
|
|
|
|
+ if TTest.TestStatic <> 6 then
|
|
|
|
+ Halt(3);
|
|
|
|
+ o := TObject.Create;
|
|
|
|
+ if o.Test <> 10 then
|
|
|
|
+ Halt(4);
|
|
|
|
+ if o.TestClass <> 11 then
|
|
|
|
+ Halt(5);
|
|
|
|
+ if o.TestStatic <> 12 then
|
|
|
|
+ Halt(6);
|
|
|
|
+ if TObject.TestClass <> 11 then
|
|
|
|
+ Halt(7);
|
|
|
|
+ if TObject.TestStatic <> 12 then
|
|
|
|
+ Halt(8);
|
|
|
|
+ os := TObjectSub.Create;
|
|
|
|
+ if os.Test <> 16 then
|
|
|
|
+ Halt(9);
|
|
|
|
+ if os.TestClass <> 17 then
|
|
|
|
+ Halt(10);
|
|
|
|
+ if os.TestStatic <> 18 then
|
|
|
|
+ Halt(11);
|
|
|
|
+ if TObjectSub.TestClass <> 17 then
|
|
|
|
+ Halt(12);
|
|
|
|
+ if TObjectSub.TestStatic <> 18 then
|
|
|
|
+ Halt(13);
|
|
|
|
+ Writeln('ok');
|
|
|
|
+end.
|