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