Если чётко указать, что поле имеет тип родительского класса, то дочерние классы уже не проходят.
type TParent=class
end;
type TChild=class(TParent)
end;
type TController=class
private
fClass:TParent;
public
procedure ProcessAnyChild(aClass:TParent);
end;
procedure Test();
var child:TChild;
controller:TController;
begin
child := TChild.Create();
controller := TController.Create();
controller.ProcessAnyChild(child)
end;
procedure TController.ProcessAnyChild(aClass: TParent);
begin
fClass:=aClass
end;