Приветствую всех, если у вас проблема с решением этой задачи пишите, оно у меня есть!
Давайте теперь предположим, что в предыдущей задаче новых геометрических примитивов добавлять мы не собираемся. Зато собираемся добавлять новые методы для работы с уже имеющимися — они могут вычислять объем, площадь поверхности, рассчитывать точку пересечения объекта с прямой и т.д.
В этом случае часто используется шаблон Visitor. Изучите этот шаблон по википедии.
Определите интерфейс IVisitor
и реализуйте его в двух классах DimensionsVisitor
и SurfaceAreaVisitor
, для рассчёта размеров (ширина, высота) и площади поверхности фигур.
В класс Body добавьте абстрактный метод Accept(IVisitor visitor).
Автоматизированные тесты проверяют лишь базовые требования. Проверить, что вы всё сделали правильно можно самостоятельно так:
- В реализациях Visitor не должно быть ни одного приведения типов и ни одного if-а. Именно этой простотой решение с Visitor-ом лучше исходного с длинным if-else.
- Работа с каждой фигурой должна оказаться в отдельном методе. А значит даже если добавится новая фигура, будет меньше возможностей случайно внести ошибку в обработку старых фигур.
- Компилятор должен контролировать, что вы не забыли обработать ни одну из фигур: если вы забудете написать один из методов, программа даже не скомпилируется.
- В интерфейсе IVisitor, в классе Body и всех его подклассах не должно быть никакого упоминания площади поверхности, размеров или конкретных классов Visitor-ов. А значит при добавлении новых рассчетов, эти классы не нужно будет модифицировать.
- Для добавления нового метода работы с фигурами, должно быть достаточно добавить новый класс Visitor-а.
1 2 3 4 5 6 7 8 9 10 11 |
using System; namespace Inheritance.Geometry { public interface IVisitor { void Visit(Ball ball); void Visit(Cube cube); void Visit(Cyllinder cyllinder); } } |
Стоимость решения этой задачи всего 100 рублей, закажи решения у меня 🙂
Внимание! Решение было обновлено в 2021