Я планирую хранить коллекцию предметов в TCollection.
Каждый элемент будет производным от TBaseItem
, который, в свою очередь, происходит от TCollectionItem,
Имея это в виду, коллекция возвратит TBaseItem
при запросе элемента.
Теперь каждый TBaseItem
будет иметь функцию Calculate
, в TBaseItem
это будет просто возвращать внутреннюю переменную, но в каждом из производных TBaseItem
функция Calculate
требует различного набора параметры.
Коллекция будет иметь функцию Calculate All
, которая перебирает элементы коллекции и вызывает каждую функцию Calculate
, очевидно, что ей нужно будет передать правильные параметры каждой функции
Я могу придумать три способа сделать это:
Создайте виртуальный / абстрактный метод для каждой функции вычисления в базовом классе и переопределите его в классе Derrived. Это означало бы, что при использовании объекта не требуется приведение типов, но это также означало бы, что мне нужно создавать партии виртуальных методов и имеет большой оператор if ... else, определяющий тип и вызывающий правильный метод «вычисления», это также означает, что вызов метода вычисления подвержен ошибкам, как вы должны знать при написании кода, который вызовите тип с правильными параметрами, чтобы избежать Error / EAbstractError.
Создайте структуру записи со всеми возможными параметрами и используйте ее в качестве параметра для функции «вычисления». Это дает дополнительное преимущество передачи этой функции в функцию «вычислить все», поскольку она может содержать все необходимые параметры и избежать потенциально очень длинного списка параметров.
Просто введите приведение TBaseItem для доступа к правильному методу вычисления. Это привело бы в порядок TBaseItem по сравнению с первым методом.
Как лучше всего обращаться с этой коллекцией?