ООП. Вопросы применения - страница 10

 

Interesting:

Способ предложенные Александром (AlexSTAL) возможно и решил бы проблему (его определенную проблематичность учитывать не будем).

Стоп-стоп-стоп!

Я не предлагал его, а сказал, что есть возможность.

А что за проблема то у вас, я понять не могу?

Вы наверное пример обсуждаете, в котором половина логики отсутствует, а половина не верна (осталась с зарождения ООП)?

 
AlexSTAL:

Стоп-стоп-стоп!

Я не предлагал его, а сказал, что есть возможность.

А что за проблема то у вас, я понять не могу?

Вот скажем в массив нужно сложить разношерстыные объекты.

При этом нужно чтобы все свойства этих объектов хранились в этом-же массиве + был доступ ко всем событиям и методам.

Возможность предложенная вами (реализация может быть различной) на сколько я понимаю позволяет получить доступ к функционалу объектов (события и метоыды).

Но вот на счет хранения данных в массиве который имеет тип предка на вряд ли выйдет (если учесть что этих данных не объявлялось в предке).


Уточню свою мысль

Если остановиться на конкретно этом примере то:

1. Скажем создать массив в котором будет храниться тип объекта, положение по X, положение по Y можно;

2. Можно попробовать идентифицировать уникальный объект по его указателю (хотя при работе с объектом указатель может и не использоваться, тогда желательно чтобы было что-то вроде хендла);

В связи с этим немного глупый вопрос (просто иного выхода пока не вижу) - а может использовать в качестве хендла указатель (создав соответствующее свойство в предке и заполнять его в конструкторе)?

3. Мы не получаем возможности хранить в массиве свойства потомков (только те которые не завялены в предке). К примеру, насколько я понимаю, хранить в массиве радиус круга или сторону квадрата не выйдет.

 
Interesting:

3. Мы не получаем возможности хранить в массиве свойства потомков (только те которые не завялены в предке). К примеру, насколько я понимаю, хранить в массиве радиус круга или сторону квадрата не выйдет.

Ну почему же не выйдет то... Вы не напрямую к ним обращайтесь, а с помощью своей функции "ПолучитьЗначение" с параметром "радиус" (если объект круг)... Это как одна из возможностей...

Вы поставьте простую конкретную задачу

 
AlexSTAL:

Ну почему же не выйдет то... Вы не напрямую к ним обращайтесь, а с помощью своей функции "ПолучитьЗначение" с параметром "радиус" (если объект круг)... Это как одна из возможностей...

Вы поставьте простую конкретную задачу

Задача проста, но вот кто сказал что ее реализовать просто.

1. Требуется записать записать в массив разнашорстные объекты (потомки базового класса) вместе с их данными.

Особо уточню что вместе с данными!!!

2. Получить результаты расчета от GetArea() для каждого из потомка;

3. Добавить следующие возможности:

а. расчет периметра квадрата - сторона *4;

б. Расчет  периметра круга - R.

3. Добавить в библиотеку дополнительные фигуры - прямоугольник (две стороны) и треугольник.

4. Добавить следующие возможности:

а. расчет площади прямоугольника - основание на высоту;

б. Расчет  периметра прямоугольника - сумма сторон *2;

в. Расчет площади треугольника;

г. Расчет периметра треугольника.

5. Идентифицировать каждый объект по отдельности (среди всех объектов и среди объектов своего класса).

Желательно с использованием указателей и без них.

6. рассчитать периметр и площадь фигур только по тем данным что хранятся в массиве.


PS

При этом переносить код из потомков в предка не допускается (если только этот код не распространяется на всех предков).

Т.е к примеру в предка не льзя перенеси радиус, поскольку в квадрате, прямоугольнике и круге его нет.

Новый функционал в предка можно добавлять, если только он распространяется на всех потомков.

За основу берем код находящийся в прицепе.

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
Файлы:
Forum-3.mq5  11 kb
 

В рамках одного массива я лично решил задачку просто добавив переменные для хранения площади и периметра в предок + функционал по записи данных в них.

При этом если контролируется результат GetArea() и прочих функций прямого расчета.

Вроде свои же правила этим не нарушил.

 

Я накидал один из способов реализации с таким подходом, который описан у Вас.

Он не полный, но там самое главное подход

Файлы:
_script.mq5  4 kb
 
AlexSTAL:

Я накидал один из способов реализации с таким подходом, который описан у Вас.

Он не полный, но там самое главное подход

Подход понятен. Скорей всего это одно из самых лучших решений подобной проблемы.

По крайней мере пока.

 
Interesting:

Задача проста, но вот кто сказал что ее реализовать просто.

1. Требуется записать записать в массив разнашорстные объекты (потомки базового класса) вместе с их данными.

...
Электронные таблицы на MQL5 задача уже решена и описана.
 
Urain:
Электронные таблицы на MQL5 задача уже решена и описана.

Как хорошо уметь читать... :)

Тоже не плохой подход, хотя как я понял оба эти подхода расчиитаны на передачу/чтение только одного парраметра (пускай и разных типов).

А вот как интересно быть если параметров много и все их не запихать в базовый класс?

Насколько я понимаю дополнительно ввести индекс параметра который передаем (также в классе можно создать массив с параметрами уложенными в него по индексу)?

 
Interesting:

Как хорошо уметь читать... :)

Тоже не плохой подход, хотя как я понял оба эти подхода расчиитаны на передачу/чтение только одного парраметра (пускай и разных типов).

А вот как интересно быть если параметров много и все их не запихать в базовый класс?

Насколько я понимаю дополнительно ввести индекс параметра который передаем (также в классе можно создать массив с параметрами уложенными в него по индексу)?

Три раза перечитал, так и не понял о чём сообщение.