Наследование TCollectionItem - PullRequest
0 голосов
/ 15 марта 2010

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

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

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 15 марта 2010

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

...