Быстрый ответ:
Не в значительном смысле
Более длинный ответ: согласно странице вики Duck Typing идентифицируется:
При утином наборе текста важны только те аспекты объекта, которые используются, а не тип самого объекта. Например, в языке без типа утки можно создать функцию, которая принимает объект типа Duck и вызывает методы walk и quack этого объекта. В языке с утиным типом эквивалентная функция будет принимать объект любого типа и вызывать методы walk и quack этого объекта. Если у объекта нет вызываемых методов, функция сигнализирует об ошибке времени выполнения.
Эквивалентный некомпилируемый код 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 typing только для ограниченной функциональности и со значительными усилиями. Этого просто нет в ДНК Delphi (потому что ДНК Delphi говорит о статической типизации), но вы могли бы получить что-то достаточно близкое, приложив много усилий и только для определенных функций. Может быть, если вы дадите нам представление о том, какая конкретная функциональность вам нужна, мы сможем что-то выяснить.
person
Cosmin Prund
schedule
29.02.2012