Я прочитал официальную документацию и понимаю, что такое ссылки на классы, но не могу понять, когда и почему они являются лучшим решением по сравнению с альтернативами.
В документации приведен пример TCollection, который может быть создан с любым потомком TCollectionItem. Обоснованием использования ссылки на класс является то, что она позволяет вам вызывать методы класса, тип которых неизвестен во время компиляции (я предполагаю, что это время компиляции TCollection). Я просто не понимаю, чем использование TCollectionItemClass в качестве аргумента превосходит использование TCollectionItem. TCollection по-прежнему сможет содержать любого потомка TCollectionItem и по-прежнему иметь возможность вызывать любой метод, объявленный в TCollectionItem. Не так ли?
Сравните это с общей коллекцией. TObjectList, похоже, предлагает те же функции, что и TCollection, с дополнительным преимуществом безопасности типов. Вы освобождаетесь от необходимости наследовать от TCollectionItem для хранения вашего типа объекта, и вы можете сделать коллекцию настолько специфичной для типа, насколько хотите. И если вам нужно получить доступ к членам элемента из коллекции, вы можете использовать общие ограничения. Помимо того факта, что ссылки на классы доступны программистам до Delphi 2009, есть ли какие-либо другие веские причины использовать их вместо общих контейнеров?
Другой пример, приведенный в документации, - это передача ссылки на класс функции, которая действует как фабрика объектов. В данном случае фабрика для создания объектов типа TControl. Это не совсем очевидно, но я предполагаю, что фабрика TControl вызывает конструктор переданного ей типа-потомка, а не конструктор TControl. Если это так, то я начинаю видеть хоть какую-то причину использования ссылок на классы.
Итак, я думаю, что я действительно пытаюсь понять, когда и где ссылки на классы наиболее подходят и что они покупают разработчику?