Быстрый ответ:
Не в значительном смысле
Более длинный ответ: Согласно вики-странице «Утиная печать» определяется как:
В типизировании утки речь идет только о тех аспектах объекта, которые используются, а не о типе самого объекта.Например, на языке, не являющемся типом утки, можно создать функцию, которая принимает объект типа Duck и вызывает методы его обхода и кряка.В языке с утиной типичностью эквивалентная функция будет принимать объект любого типа и вызывать методы его обхода и шарлатанства.Если у объекта нет вызываемых методов, функция сообщает об ошибке времени выполнения.
Эквивалентный некомпилируемый код Delphi будет выглядеть следующим образом:
procedure DoSomething(D);
begin
D.Quack;
end;
Я намеренно не указывал тип для D
, потому что это победило бы цель.Delphi имеет статическую типизацию, поэтому это никогда не сработает.Если вам это нужно для небольшой функциональности, вы можете использовать Interfaces
или RTTI
и получить что-то вроде этого:
procedure DoSomething(D:TObject);
begin
(D as ISomeIntf).Quack;
end;
Если вы можете получить RTTI:
procedure DoSomething(D:TObject);
begin
CallQuackUsingRTTI(D);
end;
У меня естьлично использовал метод RTTI
, чтобы идентифицировать (и манипулировать) объекты списка таким образом, чтобы код работал как с TList
потомками, так и с общими TList<T>
вариантами.
Вывод из этого должен быть: Даже с расширенными функциональными возможностями в новейших версиях Delphi (обобщенные и всеобъемлющие RTTI) вы только приблизитесь к типизации Duck для ограниченной функциональности и со значительными усилиями.Это просто не в ДНК Delphi (потому что ДНК Delphi говорит «статическая типизация»), но вы могли бы быть в состоянии получить что-то достаточно близко, с большими усилиями и только для определенной функциональности.Может быть, если вы дадите нам представление о том, какую конкретную функциональность вы хотите получить, мы сможем что-то выяснить.