{ %NORUN } program tw21051; {$mode Delphi}{$H+} type TCustomInner = class abstract protected function SomeMethod: T; virtual; abstract; end; TContainer = class public function GetInner: TCustomInner; end; TInner = class(TCustomInner) private FContainer: TContainer; protected function SomeMethod: T; override; public constructor Create(AContainer: TContainer); end; function TContainer.GetInner: TCustomInner; type InnerClass = TInner; begin Result := InnerClass.Create(Self); end; function TInner.SomeMethod: T; begin end; constructor TInner.Create(AContainer: TContainer); begin FContainer := AContainer; end; procedure Test; var C: TContainer; begin C := TContainer.Create; end; begin Test; end.