Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Чего они все же хотят?

03.12.07 22:30
Re: Чего они все же хотят?
 
Murr коренной житель
Murr
в ответ AlexNek 03.12.07 21:07
Но это будет уже другой концепт.
-----
Ну хорошо. Возьмем следующий концепт:
- абстрактный класс
- грязный класс
- чистый виртуальный метод
- виртуальный метод
Концепт предполагает простое наследование.
Абстрактный класс - наследуется, если нужно, от другого абстрактного класса, не содержит полей данных, содержит по крайней мере один чистый виртуальны метод.
Грязный класс - класс наследуемый от абстрактного класса или от другого грязного класса, обязан содержать локальные поля данных.
Чистый виртуальный метод - виртуальный метод изначально определенный в абстрактном классе и имплементируемый в каждом наследующем классе.
Вируальный метод - классический (плюсовый) виртуальный метод.
Разница между чистым виртуальным методом и виртуальным методом.
Концепт требует имплементации чистого виртуального метода в каждом классе иерархии, исключая абстрактные, в случае отсутствия имплементации должна возникать отслеживаемая ошбочная ситуация.
Для виртуального метода не требуется имплементация в каждом классе, при отсутствии имплементации вызывается соответствующий метод базового класса.
Суть этих требований - чистый виртуальный метод используется в ситуациях, когда необходима операция, эквивалентная сериализации/десериализации, на каждом уровне наследования, а виртальные метод - отрисовка объекта (см. ниже Draw()).
Этот концепт ты в состоянии реализовать на С++, хотя будеш ругаться на необходимость отслеживать чистые виртуальные методы и писать заглушки на каждом уровне...
Продолжение концепта.
- чистый класс - класс, наследуемый от грязного класса и не имеющий полей данных.
- пустой виртуальный метод - метод не содержащий в себе полезной функциональной нагрузки, кроме вызова аналогичного метода базового класса или обработки ошибочного вызова и их комбинации с условиями.
Чистый класс вводится чтобы исключить необходимость переделывать код на уровне приложения, оперирующего конкретными понятиями. Например, есть ряд классов
ПроизвольнаяЛоманая->ЗамкнутаяПроизвольнаяЛоманная->ВыпуклыеМногоугольники,
ВыпуклыеМногоугольники->Треугольник,
ВыпуклыеМногоугольники->Прямоугольник,
ВыпуклыеМногоугольники->Трапеция,
ВыпуклыеМногоугольники->Пятиугольник и etc...
Классы Треугольник, Прямоугольник, Трапеция, Пятиугольник являются чистыми, т.е. не содержат никаких элементов данных, но позволяют проверить и ограничить количество рисуемых отрезков.
Последняя имплементация виртуального метода Draw() определен на уровне ЗамкнутаяПроизвольнаяЛоманная и позволяет отобразить заданную ломаную как замкнутую фигуру.
Пустой виртуальный метод введен для уменьшения объема кодирования. Поскольку метод не содержит полезной функциональной нагрузки его имплементация запрещена в данном концепте.
В данном месте у тебя должны возникнуть вопросы:
- Как имплементировать заглушки в грязных классах, все данные которых не используются в сериализации/десериализации?
- Как имплементировать заглушки для чистых виртуальных методов в чистых классах, если их имплементация одновремнно требуется и запрещена концептом?
Собственно, над вопросами работать тебе. Ответ можно дать в двух вариантах:
- найти нелогичность в концепте,
- указать подходящее средство имплементации...
А если я их не вызываю?
-----
Тогда ты их имплементируешь и не вызываешь.
И как ты при динамическом размещении запретишь доступ к отдельным полям в сях?
-----
Недоступностью указателя на структуру. Просто физической невозможностью его получить.
Кстати, был проект где динамическое выделение памяти было просто напросто запрещено.
------
Ну и как, при наличии таких требований в концепте, ты его будешь реализовывать при использовании С++ объектов? Плюсовый new в обязательном порядке выполняет динамическую аллокацию.
А чем это мотивировано, и каким образом конструктор может быть виртуальным?
------
А что он может быть виртуальным - само по себе не проблема.
Чем мотивировано - не знаю, надо спрашивать у разработчиков, но скорее всего тем, что используемая в Билдере VCL написана на (Б)Паскале, а в нем конструкторы могут быть виртуальными и при наследовании с этой виртуальностью надо что-то делать.
Но там будет валом других ошибок
------
Смотри заданный выше концепт и выбери наименее глючный тоолс для реализации... :)
 

Перейти на