Наследование TCollectionItem

Я планирую хранить коллекцию предметов в TCollection.

Каждый элемент будет производным от TBaseItem который в свою очередь происходит от TCollectionItem,

Имея это в виду, коллекция вернется TBaseItem когда предмет запрашивается.

Теперь каждый TBaseItem будет иметь Calculate функция, в TBaseItem это просто вернет внутреннюю переменную, но в каждом из производных TBaseItem Calculate Функция требует другого набора параметров.

Коллекция будет иметь Calculate All функция, которая перебирает элементы коллекции и вызывает каждый Calculate функция, очевидно, она должна будет передавать правильные параметры каждой функции

Я могу придумать три способа сделать это:

  1. Создайте виртуальный / абстрактный метод для каждой функции вычисления в базовом классе и переопределите ее в классе Derrived. Это будет означать, что при использовании объекта не требуется приведение типов, но это также будет означать, что мне нужно создать множество виртуальных методов и иметь большой оператор if...else, определяющий тип и вызывающий правильный метод "вычисления", это также означает, что вызов метода вычисления подвержен ошибкам, так как вы должны знать при написании кода, какой из них вызывать для какого типа с правильные параметры, чтобы избежать Error/EAbstractError.

  2. Создайте структуру записи со всеми возможными параметрами и используйте ее в качестве параметра для функции "вычисления". Это дает дополнительное преимущество передачи этой функции в функцию "вычислить все", поскольку она может содержать все требуемые параметры и избежать потенциально очень длинного списка параметров.

  3. Просто введите приведение TBaseItem для доступа к правильному методу вычисления. Это привело бы в порядок TBaseItem по сравнению с первым методом.

Как лучше всего обращаться с этой коллекцией?

1 ответ

Решение

Если все они имеют разные сигнатуры методов, то вы ничего не получите, имея виртуальные методы - они также могут быть статичными. Я бы высказался за "общий"/"канонический" набор параметров, как в вашем случае 2, и за виртуальные / переопределенные методы Calculate, по крайней мере, на основе описания, которое вы уже дали.

Другие вопросы по тегам