mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 02:19:22 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			175 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
program tthlp24;
 | 
						|
 | 
						|
{$mode objfpc}
 | 
						|
{$modeswitch typehelpers}
 | 
						|
 | 
						|
type
 | 
						|
  ITestIntf = interface
 | 
						|
    function Blubb: LongInt;
 | 
						|
    function Foobar: LongInt;
 | 
						|
  end;
 | 
						|
 | 
						|
  ITestIntfSub = interface(ITestIntf)
 | 
						|
    function Something: LongInt;
 | 
						|
  end;
 | 
						|
 | 
						|
  ITestIntfSubSub = interface(ITestIntfSub)
 | 
						|
    function SomethingElse: LongInt;
 | 
						|
  end;
 | 
						|
 | 
						|
  TTest = class(TInterfacedObject, ITestIntf)
 | 
						|
    function Blubb: LongInt;
 | 
						|
    function Foobar: LongInt;
 | 
						|
  end;
 | 
						|
 | 
						|
  TTestSub = class(TTest, ITestIntfSub)
 | 
						|
    function Something: LongInt;
 | 
						|
  end;
 | 
						|
 | 
						|
  TTestSubSub = class(TTestSub, ITestIntfSubSub)
 | 
						|
    function SomethingElse: LongInt;
 | 
						|
  end;
 | 
						|
 | 
						|
  TTestIntfHelper = type helper for ITestIntf
 | 
						|
    function Blubb: LongInt;
 | 
						|
    function Foobar(aArg: LongInt): LongInt; overload;
 | 
						|
    function Test: LongInt;
 | 
						|
    function Calculate: LongInt;
 | 
						|
    function CalculateBase: LongInt;
 | 
						|
    class function TestStatic: LongInt; static;
 | 
						|
  end;
 | 
						|
 | 
						|
  TTestIntfSubSubHelper = type helper(TTestIntfHelper) for ITestIntfSubSub
 | 
						|
    function SomethingElse: LongInt;
 | 
						|
    function Calculate: LongInt;
 | 
						|
    function CalculateBase: LongInt;
 | 
						|
    function CalculateBase2: LongInt;
 | 
						|
  end;
 | 
						|
 | 
						|
{ TTestSubSub }
 | 
						|
 | 
						|
function TTestSubSub.SomethingElse: LongInt;
 | 
						|
begin
 | 
						|
  Result := 9;
 | 
						|
end;
 | 
						|
 | 
						|
{ TTestSub }
 | 
						|
 | 
						|
function TTestSub.Something: LongInt;
 | 
						|
begin
 | 
						|
  Result := 8;
 | 
						|
end;
 | 
						|
 | 
						|
{ TTestIntfSubSubHelper }
 | 
						|
 | 
						|
function TTestIntfSubSubHelper.SomethingElse: LongInt;
 | 
						|
begin
 | 
						|
  Result := 7;
 | 
						|
end;
 | 
						|
 | 
						|
function TTestIntfSubSubHelper.Calculate: LongInt;
 | 
						|
begin
 | 
						|
  Result := 100 * SomethingElse + inherited Calculate;
 | 
						|
end;
 | 
						|
 | 
						|
function TTestIntfSubSubHelper.CalculateBase: LongInt;
 | 
						|
begin
 | 
						|
  Result := 100 * inherited SomethingElse + inherited CalculateBase;
 | 
						|
end;
 | 
						|
 | 
						|
function TTestIntfSubSubHelper.CalculateBase2: LongInt;
 | 
						|
begin
 | 
						|
  Result := 100 * inherited SomethingElse + inherited Calculate;
 | 
						|
end;
 | 
						|
 | 
						|
{ TTest }
 | 
						|
 | 
						|
function TTest.Blubb: LongInt;
 | 
						|
begin
 | 
						|
  Result := 4;
 | 
						|
end;
 | 
						|
 | 
						|
function TTest.Foobar: LongInt;
 | 
						|
begin
 | 
						|
  Result := 5;
 | 
						|
end;
 | 
						|
 | 
						|
{ TTestIntfHelper }
 | 
						|
 | 
						|
function TTestIntfHelper.Blubb: LongInt;
 | 
						|
begin
 | 
						|
  Result := 3;
 | 
						|
end;
 | 
						|
 | 
						|
function TTestIntfHelper.Foobar(aArg: LongInt): LongInt;
 | 
						|
begin
 | 
						|
  Result := aArg;
 | 
						|
end;
 | 
						|
 | 
						|
function TTestIntfHelper.Test: LongInt;
 | 
						|
begin
 | 
						|
  Result := 1;
 | 
						|
end;
 | 
						|
 | 
						|
function TTestIntfHelper.Calculate: LongInt;
 | 
						|
begin
 | 
						|
  Result := 10 * Blubb + Foobar;
 | 
						|
end;
 | 
						|
 | 
						|
function TTestIntfHelper.CalculateBase: LongInt;
 | 
						|
begin
 | 
						|
  Result := 10 * inherited Blubb + inherited Foobar;
 | 
						|
end;
 | 
						|
 | 
						|
class function TTestIntfHelper.TestStatic: LongInt;
 | 
						|
begin
 | 
						|
  Result := 2;
 | 
						|
end;
 | 
						|
 | 
						|
var
 | 
						|
  i: ITestIntf;
 | 
						|
  _is: ITestIntfSub;
 | 
						|
  iss: ITestIntfSubSub;
 | 
						|
begin
 | 
						|
  i := TTest.Create;
 | 
						|
  if i.Test <> 1 then
 | 
						|
    Halt(1);
 | 
						|
  if i.TestStatic <> 2 then
 | 
						|
    Halt(2);
 | 
						|
  if ITestIntf.TestStatic <> 2 then
 | 
						|
    Halt(3);
 | 
						|
  if i.Blubb <> 3 then
 | 
						|
    Halt(4);
 | 
						|
  if i.Foobar <> 5 then
 | 
						|
    Halt(5);
 | 
						|
  if i.Foobar(6) <> 6 then
 | 
						|
    Halt(6);
 | 
						|
  if i.Calculate <> 35 then
 | 
						|
    Halt(7);
 | 
						|
  if i.CalculateBase <> 45 then
 | 
						|
    Halt(8);
 | 
						|
  i := Nil;
 | 
						|
 | 
						|
  _is := TTestSub.Create;
 | 
						|
  if _is.Blubb <> 3 then
 | 
						|
    Halt(9);
 | 
						|
  if _is.Foobar(8) <> 8 then
 | 
						|
    Halt(10);
 | 
						|
  _is := Nil;
 | 
						|
 | 
						|
  iss := TTestSubSub.Create;
 | 
						|
  if iss.SomethingElse <> 7 then
 | 
						|
    Halt(11);
 | 
						|
  if iss.Blubb <> 3 then
 | 
						|
    Halt(12);
 | 
						|
  if iss.Calculate <> 735 then
 | 
						|
    Halt(13);
 | 
						|
  if iss.CalculateBase <> 945 then
 | 
						|
    Halt(14);
 | 
						|
  if iss.CalculateBase2 <> 935 then
 | 
						|
    Halt(15);
 | 
						|
  iss := Nil;
 | 
						|
 | 
						|
  Writeln('ok');
 | 
						|
end.
 |