Вы должны инициализировать ref
перед использованием. Например в конструкторе:
constructor Printer<T>.Create (Obj : T);
begin
ref := Obj;
end;
Проблема в том, что вы храните переменную, объявленную как
var
john : Person;
в интерфейсе INamed
. Интерфейсы в Delphi подсчитываются, и подсчет ссылок работает только в том случае, если вы используете исключительно типы интерфейсов или типы классов. В вашем случае объект "Джон" уничтожается, прежде чем использовать его. Попробуйте сделать:
john2 : INamed;
...
john2 := Person.Create('John');
Printer.ref := john2;
Printer.Print;
Обратите внимание, что дженерики, вероятно, не то, что вы хотите здесь. Просто сохраните ссылку INamed
и затем вызовите ref.GetName
в методе Print
. Или вы могли бы сделать
TPrinter = class
public
procedure Print (Obj : INamed);
end;
procedure TPrinter.Print (Obj : INamed);
begin
WriteLn (Obj.GetName);
end;